2012-09-27 6 views
5

で、ドキュメントオブジェクト配列への追加の簡単な例:マングース/ MongoDBは - これらは私のコレクションのスキーマあると仮定して、簡単のがたのためにあらかじめ定義されたスキーマ

var MessageDeliverySchema = new Schema({ 
    from : { type : String }, 
    to  : { type : String }, 
    status : { type : String } 
}); 

var Messages = mongoose.model('messages', 
new Schema({ 
    id    : ObjectId, 
    user   : { type:String }, 
    'sent-messages' : [MessageDeliverySchema] 
})); 

コレクション内したがって、各文書メッセージは、MessageDeliverySchemaによって定義されたの4分の5 送信メッセージを持つことができます。私が何をしたいか

送信され、メッセージの配列を持っているので、私はちょうどメッセージを更新し、別の送信されたメッセージを追加するには、各時間は、配信確認が来ます。私が試した何

var delivered = { 
from: 'foo', 
to: 'bar', 
status: 'delivered' 
}; 

Message.update({_id: '5064aae4154cb34d14000001' }, 
     {$pushAll: { 'sent-messages' : delivered }} , {upsert:true}, function(err, data) { 

}); 

Message.update({_id: '5064aae4154cb34d14000001' }, 
     {$push: { 'sent-messages' : delivered }},{upsert:true}, function(err, data) { 
}); 

$ pushAll、および$のプッシュは、その代わりに、既存のメッセージを上書きし、送信されたメッセージ-に新しいオブジェクトを追加しません。私が見たいと思って何

は、送信されたメッセージ例えばの配列です:

{ 
    'sent-messages': [ 
     { 
      from: 'foo', 
      to: 'bar', 
      status: 'delivered' 
     }, 
     { 
      from: 'pippo', 
      to: 'pippo', 
      status: 'delivered' 
     }, 
     { 
      from: 'paul', 
      to: 'smith', 
      status: 'undelivered' 
     } 
    ] 
} 
+0

は '$のpush'を使用する権利演算子であり、私はそれをしようとしたとき、コードがうまく働きました。私がそれを走らせるたびに、新しい 'sent-messages'配列要素が追加されました。 – JohnnyHK

+0

@JohnnyHKああ、そう、それは既存のメッセージを上書きしていませんでした。エラーが発生しました: '$ push/$ pushAll修飾子を非配列に適用できません'。 – StuR

+1

すでにデータベースにあるドキュメントの 'sent-messages'プロパティが配列でないため、プッシュできません。おそらくあなたは他の手段でその文書を追加していますので、あなたのMongooseスキーマと一致しません。 – JohnnyHK

答えて

9

私はなっていたエラーでした:「非配列に$プッシュ/ $ pushAll修飾子を適用することはできません」。

私はこのようなドキュメントにオブジェクトを追加しました:

Message.update({_id: '5064aae4154cb34d14000001' }, 
      { 'sent-messages' : delivered }, function(err, data) { 
    }); 

そして、私に上記のエラーを与えた$プッシュを実行しようとしました。

私はその文書を削除して、$ pushを使用して目的の効果を得ました。参考のため

これは、既存の文書に追加する正しい方法で、私の質問への答え:

Message.update({_id: '5064aae4154cb34d14000001' }, 
     {$push: { 'sent-messages' : delivered }},{upsert:true}, function(err, data) { 
}); 
関連する問題