在Mongoose模型中保存修改后的文档(带有修改过的子文档数组)

时间:2014-02-25 01:39:51

标签: javascript node.js mongodb mongoose nosql

我目前的代码是:

User.findOne(
    {
        "subUsers.email" : userEmail
    },
    {
        subUsers : {
            $elemMatch: {
                email : userEmail                            }
        }
    },
    function(err, user){
        if(user){
            var information = user.subUsers[0].information.id(id);

            information.arrayA.push({someId : "something"});

            user.save(callback(err)); // Also tried information.save()
                                      // without luck
        }

        callback(err);
    }
);

这不会返回任何类型的错误,但是当我检查数据库时,没有推送新的数组元素(整个文档完好无损)。

非常感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:1)

你应该看一下第一个常见问题,在这里:http://mongoosejs.com/docs/faq.html

Mongoose doesn't create getters/setters for array indexes; without them mongoose never gets 
notified of the change and so doesn't know to persist the new value. The work-around is to 
use [MongooseArray set][1] available in Mongoose >= 3.2.0.

所以在你的情况下,你想要添加第三行

var information = user.subUsers[0].information.id(id);
information.arrayA.push({someId : "something"});
user.subUsers.set(0, information);

或类似的东西。

答案 1 :(得分:0)

截至今天,Mongoose目前尚未准备好以原子方式进行多级嵌套。

因此,即使它返回到一种关系数据库,在这种情况下,最好将嵌套分割为至少2个集合,并使用自动生成的ObjectId进行引用。