我一直坚持这个流星问题。我想在mongodb中更新文档中的嵌套数组。但是它似乎根本没有更新文档。此外,没有发出错误消息让我感到困惑。
Document structure:
|----_id
|----name
|----members (Array)
|---- [0]
|----history (Array)
|----[0]={type:2,startdate:010304,enddate:120314}
|----[1]={type:1,startdate:140904,enddate:150914}
|----[2]={type:3,startdate:241204,enddate:291214}
|----!!!!!I WANNA ADD THE ENTRY HERE !!!!!!!!!!
|----state
|---- [1]
|----history (Array)
|----[0]={type:2,startdate:010304,enddate:120314}
|----State
这是代码
hisobj = {'type':type, 'startdate':startdate,'enddate':enddate};
parstr = "members["+insertmemberid+"].history";
Groups.update({"_id":Session.get("groupid")},{$addToSet:{parstr:{$each: [hisobj]} } });
非常感谢任何建议。
答案 0 :(得分:1)
在update
函数中,parstr
是一个javascript标识符。它被用作属性名称而不进行解析。它与使用字符串"parstr"
具有相同的效果。要将变量的值用作属性名称,必须使用数组表示法。因此,创建一个对象作为addToSet操作的值,并使用值parstr
在那里设置属性。
hisobj = {'type':type, 'startdate':startdate,'enddate':enddate};
parstr = "members." + insertmemberid + ".history";
// create an object to be used as the value of the addToSet operation
var addToSetValue = {};
// the value stored in parstr will be used here
addToSetValue[parstr] = hisobj;
Groups.update({"_id":Session.get("groupid")}, {$addToSet: addToSetValue}}, function (error) {
if (error) {
console.log(error);
}
});
请注意,在parstr
内,您需要使用点符号,正如Hubert OG所说。这是一个不同的情况。我们只是创建了mongodb将在内部使用的字符串,以实现它的魔力。
此外,作为更新调用的最后一个参数的回调将让您看到可能的错误。
答案 1 :(得分:0)
尝试点符号而不是括号:
parstr = "members."+insertmemberid+".history";
假设insertmemberid === 0
。
此外,由于您使用$addToSet
运算符,请确保添加到数组中的对象不等于已存在的对象。