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

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


我可以$set数组items中嵌入对象的heros数组的第二个元素与nickname "test"吗?

结果:

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


#1 楼

您需要使用两个概念:mongodb的位置运算符,并只对要更新的条目使用数字索引。
位置运算符允许您使用如下条件:
{"heroes.nickname": "test"}

,然后像这样引用找到的数组条目:因此:
{"heroes.$  // <- the dollar represents the first matching array key index


评论


如何访问匹配元素的值?像{“ heros。$。items.2”:“ heros。$。nickname”}一样?

–kommradHomer
15年5月30日在9:11

@ ad7six如何更新最后一个元素。我不知道数组的大小。 (在python中,类似items [-1] ='new value')。

– Amit Tripathi
15年6月16日在10:58

@Amit是否需要:通过询问该问题=)

– AD7six
15年6月16日在12:06

#2 楼

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

)


#3 楼

此解决方案效果很好。只想增加一点。
这是结构。我需要找到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)