Nodejs和Mongoose。查询和更新对象数组中的对象数组

时间:2014-04-05 10:27:17

标签: node.js mongodb mongoose

我需要使用mongoose更新文档,mongoose包含一个对象数组,其中数组中的每个对象也包含一个对象数组。

伪代码就像这样:

user.rooms[{where roomname = 'abc123'}].messages.push({message: 'hello', from: 'james'})

在哪里'房间'是一个对象数组。

和'消息'是一个对象数组,它们位于一个房间对象内,该对象本身就位于房间数组中。

我对如何使用$ in mongoose for arrays以及$ elemMatch构建查询感到困惑。点语法,$ set与$ push等...

var roomname = 'abc123';

User.findOneAndUpdate({'rooms.name' : room},{ */* WHAT GOES HERE? */* }, {upsert:true} function (err, messagesDoc) {

    if (err){
        return done(err);
    }    

    if (messagesDoc) {         

    } else {


    }

    });

这可能吗?我应该为用户和房间使用单独的收藏吗?

编辑/更新

所以我一直在试图解决这个问题,并认为我越来越近了,但现在我遇到了错误。

这是我现在使用的查询:

User.findOneAndUpdate({ 'local.rooms.name' :  room },
    {$push: {'local.rooms.$.messages': chatmessage}},

    function(err, doc) {

});

这是我得到的错误:

C:\[PATH]\app\node_modules\mongoose\node_modules\mquery\lib\utils.js:
26
    if (/ObjectI[dD]$/.test(obj.constructor.name)) {
                       ^
RangeError: Maximum call stack size exceeded
DEBUG: Program node app exited with code 8

我还应该补充一点,我可以看到查询的第一部分正在运行。如果我找到它,我可以注销预期的结果。它似乎是导致错误的更新对象。

1 个答案:

答案 0 :(得分:0)

您似乎无法使用findOneAndUpdate存储mongoose模型,并使用$ push将模型对象推送到数据库中。当我将其更改为$ push我创建的具有与模型相同属性的对象(当然没有自动生成的id)时,对象将被插入到数据库中。

我不确定这是一个错误还是预期的功能。

我的实际解决方案是重构数据库,因此我不再将嵌套的子文档作为对象数组。即我为房间创建了一个新的集合。我也使用了findOne()函数,然后使用save()函数而不是findOneAndUpdate()。这让我可以毫无问题地存储猫鼬模型。