我的猫鼬物体:
{
"_id" : "568ad3db59b494d4284ac191",
"name" : "MyCompany",
"description": "whatever"
"items" : [
{
"_id" : "568ad3db59b494d4284ac19f",
"fields" : {
"Name" : "Item1",
"Internal ID" : "ID00042",
"tags" : [
{
"Description" : "Tag1",
"Level" : 2
},
{
"Description" : "Tag2",
"Level" : 3
}
]
}
}, {
"_id" : "568ad3db59b494d4284ac19f",
"fields" : {
"Name" : "Item2",
"Internal ID" : "ID00043",
"tags" : [
{
"Description" : "Tag1",
"Level" : 5
},
{
"Description" : "Tag5",
"Level" : 1
}
]
}
}, {..}
]
}
我需要推送以下标签:
var obj = {
"Description" : "myDescription",
"Level" : 3
};
进入以下项目的标签数组:
var internal_id = "ID00102";
我的尝试无效:
Company.findOneAndUpdate(
{ "_id": "568ad3db59b494d4284ac191", "items.fields['Internal ID]": internal_id },
{
"$push": {
"tags": thetag
}
},
function(err,doc) {
if (err) res.status(500).send(err);
return res.status(200).send(doc);
}
);
答案 0 :(得分:2)
将$push
运算符与更新中的 $
positional operator 一起应用,将标记对象添加到tags
字段。 $
positional operator 将标识要更新的items
数组中的正确元素,而不显式指定数组中元素的位置,因此您的最终更新语句应如下所示: / p>
Company.update(
{ "_id": "568ad3db59b494d4284ac191", "items.fields.Internal ID": internal_id },
{
"$push": {
"items.$.fields.tags": thetag
}
}
)
答案 1 :(得分:0)
Company.findOneAndUpdate(
{ "_id": "568ad3db59b494d4284ac191", "items.fields['Internal ID]": internal_id },
{
"$push": {
"tags": thetag
}
},
function(err,doc) {
if (err) res.status(500).send(err);
return res.status(200).send(doc);
}
);
在上面的示例中:
{ "_id": "568ad3db59b494d4284ac191", "items.fields['Internal ID]": internal_id },
MISSING' at" items.fields ['内部ID]"
在对象名称中包含空格并不是很好的做法,因为在" items.fields.Internal ID"中,它并不总是起作用并且给出了一些尴尬的问题。使用internalId只会让事情变得不那么尴尬。