【发布时间】:2014-04-10 17:30:01
【问题描述】:
我需要使用 mongoose 更新一个包含对象数组的文档,其中数组中的每个对象还包含一个对象数组。
伪代码类似于:
user.rooms[{where roomname = 'abc123'}].messages.push({message: 'hello', from: 'james'})
其中 'rooms' 是一个对象数组。
'messages' 是一个对象数组,它位于一个房间对象内,该对象本身位于房间数组中。
对于如何在 mongoose 中使用 $ 作为数组以及 $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
我还应该补充一点,我可以看到查询的第一部分正在运行。如果我能找到一个,我可以注销预期的结果。似乎是导致错误的更新对象。
【问题讨论】: