MongoDB 中精确元素数组中的更新字段

我有一个这样的文档结构:

{
_id:"43434",
heroes : [
{ nickname : "test",  items : ["", "", ""] },
{ nickname : "test2", items : ["", "", ""] },
]
}

我可以 $set的第二个元素的 items数组的嵌入对象在数组 herosnickname "test"

结果:

{
_id:"43434",
heroes : [
{ nickname : "test",  items : ["", "new_value", ""] }, // modified here
{ nickname : "test2", items : ["", "", ""] },
]
}
61218 次浏览

您需要使用两个概念: 蒙哥布的位置运算符和简单地使用要更新的条目的数字索引。

位置运算符允许您使用如下条件:

{"heroes.nickname": "test"}

然后像下面这样引用找到的数组条目:

{"heroes.$  // <- the dollar represents the first matching array key index

当你想要更新第二个数组条目在“项目”,和数组键是0索引-这是关键1。

所以:

> db.denis.insert({_id:"43434", heroes : [{ nickname : "test",  items : ["", "", ""] }, { nickname : "test2", items : ["", "", ""] }]});
> db.denis.update(
{"heroes.nickname": "test"},
{$set: {
"heroes.$.items.1": "new_value"
}}
)
> db.denis.find()
{
"_id" : "43434",
"heroes" : [
{"nickname" : "test", "items" : ["", "new_value", "" ]},
{"nickname" : "test2", "items" : ["", "", "" ]}
]
}

尝试使用位置 $和 $位置更新,

db.collection.update(
{ heroes:{ $elemMatch:{ "nickname" : "test"} } },
{
$push: {
'heroes.$.items': {
$each: ["new_value" ],
$position: 1
}
}
}
)

这个解决方案很好。只需要添加一个点。 这是结构。我需要找到 OrderItemId 是“ yyy”并更新。 如果条件查询字段为数组,如下面的“ OrderItems”所示。“ OrderItemId”是数组。不能使用“ OrderItems”。“ OrderItemId [0]”作为查询中的操作。相反,您需要使用“ OrderItems”。“ OrderItemId”进行比较。否则,它不能匹配一个。

{
_id: 'orderid',
OrderItems: [
{
OrderItemId: ['xxxx'],
... },
{
OrderItemId: ['yyyy'],
...},
]


}
 result =  await collection.updateOne(
{ _id: orderId, "OrderItems.OrderItemId": [orderItemId] },
{ $set: { "OrderItems.$.imgUrl": imgUrl[0], "OrderItems.$.category": category } },
{ upsert: false },
)
console.log('  (result.modifiedCount) ', result.modifiedCount)
console.log('  (result.matchedCount) ', result.matchedCount)

试试 使用位置 $更新数组中的文档,

位置 $运算符有助于更新包含嵌入文档的数组。使用位置 $运算符访问嵌入式文档中使用 $运算符上的点符号的字段。

db.collection.update(
{ "heroes.nickname": "test" },
{ $set: { "heroes.$.items.1": "new_value" } },
{ multi: true }
);

游乐场

更进一步! 使用字符串模板粘贴您的可变索引的方式

   yourModel.findOneAndUpdate(
{ _id: "43434" },
{
$set: {
[`heroes.${heroesIndex}.items.${itemIndex}`]: "new_value",
},
}
);

或者 没有模板

   yourModel.findOneAndUpdate(
{ _id: "43434" },
{
$set: {
'heroes.0.items.1': "new_value",
},
}
);