所以我发现SO上关于如何更新子数组中的字段的相关帖子很少,例如这个here
我想要实现的基本相同,但是动态更新子数组中的字段,而不是仅仅在查询中调用字段名称。 现在我也发现如何在主对象中直接做到这一点,但似乎无法在子数组中进行。
在子对象中动态插入的代码:
_.each(data.data, function(val, key) {
var obj = {};
obj['general.'+key] = val;
insert = 0 || (Documents.update(
{ _id: data._id },
{ $set: obj}
));
});
以下是我要做的事情的树:
Documents: {
_id: '123123'
...
smallRoom:
[
_id: '456456'
name: 'name1'
description: 'description1'
],
[
...
]
}
这是我的代码:
// insert a new object in smallRoom, with only the _id so far
var newID = new Mongo.ObjectID;
var createId = {_id: newID._str};
Documents.update({_id: data._id},{$push:{smallRooms: createId}})
插入其他字段的部分:
_.each(data.data, function(val, key) {
var obj = {};
obj['simpleRoom.$'+key] = val;
console.log(Documents.update(
{
_id: data._id, <<== the document id that I want to update
smallRoom: {
$elemMatch:{
_id : newID._str, <<== the smallRoom id that I want to update
}
}
},
{
$set: obj
}
));
});
好的,说完了,我知道我可以直接插入整个物体,而不必推动每一个场地。
但是我想这个问题更像是,如果smallRoom有50个字段,它是如何工作的,我想更新3个随机字段? (所以我需要使用_each循环,因为我事先不知道要更新哪个字段,并且不想替换整个对象)
答案 0 :(得分:1)
我不确定我是否100%理解您的问题,但我认为您要问的答案是使用$
符号。
示例:
Documents.update(
{
_id: data._id, smallRoom._id: newID._str
},
{
$set: { smallroom.$.name: 'new name' }
}
);
您找到的文档与_id
:data._id
匹配,然后在数组smallRoom
中找到_id
等于newId._str
的对象。然后,您使用$
符号告诉Mongo更新该对象的name
密钥。
希望有所帮助