为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

汪汪一只猫 2019-07-04 16:33:11

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

我有一个这样的文档:

{
    _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 : ["", "", ""] },
    ]}


查看完整描述

3 回答

?
慕瓜9086354

您需要使用两个概念:MongoDB位置算子并简单地为要更新的条目使用数字索引。

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

{"heros.nickname": "test"}

然后引用已找到的数组条目,如下所示:

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

因为您想要更新“Item”中的第二个数组条目,而数组键是0索引-这是键1。

因此:

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


查看完整回答
反对 回复 2019-07-04
?
杨魅力
db.collection.update({heroes:{$elemMatch:{ "nickname" : "test"}}},
 {
     $push: {
        'heroes.$.items': {
           $each: ["new_value" ],
           $position: 1
        }
     }
   })


查看完整回答
反对 回复 2019-07-04
?
慕的地10843

这个解决方案效果很好。只想补充一点。这是结构。我要找到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-07-04

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信