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中的每个文档可能有 4/5由 MessageDeliverySchema 定义的已发送消息。

我想要做的是有一个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 回答