6

簡単にするために、これらが私のコレクション スキーマであると仮定します。

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]
}));

したがって、コレクションMessages内の各ドキュメントには、MessageDeliverySchema によって定義された4/5の送信済みメッセージが含まれる場合があります。

私がやりたいのは、sent-messagesの配列を持つことです。そのため、配信確認が来るたびに、Messagesを更新し、別の送信済みメッセージを追加するだけです。

私が試したこと:

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 と $push は、新しいオブジェクトをsent-messagesに追加するのではなく、既存のメッセージを上書きします。

私が見たいのは、送信されたメッセージの配列です。

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

1 に答える 1

10

私が得ていたエラーは、「$push/$pushAll 修飾子を非配列に適用できません」でした。

次のようにドキュメントにオブジェクトを追加しました。

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

そして、$push を実行しようとしたところ、上記のエラーが発生しました。

そのため、ドキュメントを削除して $push を使用すると、望ましい効果が得られました。

参考までに、これは既存のドキュメントに追加する正しい方法であり、私の質問に対する答えです:

Message.update({_id: '5064aae4154cb34d14000001' },
         {$push: { 'sent-messages' : delivered }},{upsert:true}, function(err, data) { 
});
于 2012-09-28T09:05:02.290 に答える