71

我有一个结构如下的文档:

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

我可以在数组中嵌入对象数组的$set第二个元素吗?itemsherosnickname "test"

结果:

{
    _id:"43434",
    heroes : [
        { nickname : "test",  items : ["", "new_value", ""] }, // modified here
        { nickname : "test2", items : ["", "", ""] },
    ]
}
4

4 回答 4

144

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

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

{"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" : ["", "", "" ]}
    ]
}
于 2012-05-03T14:03:16.997 回答
3

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

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

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

操场

于 2021-04-23T10:36:13.023 回答
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)
于 2019-04-17T04:44:28.917 回答
1

尝试使用位置 $ 和$position进行更新,

db.collection.update(
  { heroes:{ $elemMatch:{ "nickname" : "test"} } },
  {
    $push: {
      'heroes.$.items': {
        $each: ["new_value" ],
        $position: 1
      }
    }
  }
)
于 2018-10-11T13:27:14.993 回答