Mongoose/MongoDB - 使用预定义模式附加到文档对象数组的简单示例

Stu*_*tuR 6 mongoose mongodb database-schema

为了简单起见,假设这些是我的集合模式:

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]
}));
Run Code Online (Sandbox Code Playgroud)

因此,集合Messages中的每个文档可能具有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) { 
});
Run Code Online (Sandbox Code Playgroud)

$ pushAll和$ push不会将新对象附加到已发送消息,而是覆盖现有消息.

我想看到的是一系列已发送的消息,例如:

{
    'sent-messages': [
        {
            from: 'foo',
            to: 'bar',
            status: 'delivered'
        },
        {
            from: 'pippo',
            to: 'pippo',
            status: 'delivered'
        },
        {
            from: 'paul',
            to: 'smith',
            status: 'undelivered'
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

Stu*_*tuR 10

我得到的错误是:'无法将$ push/$ pushAll修饰符应用于非数组'.

我在文档中添加了一个对象,如下所示:

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

然后试图做一个$ push,这给了我上面的错误.

所以我删除了文档并使用了具有所需效果的$ push.

作为参考,这是附加到现有文档的正确方法,以及我的问题的答案:

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