【问题标题】:Mongodb update the specific element from subarrayMongodb 更新子数组中的特定元素
【发布时间】:2012-03-04 01:22:24
【问题描述】:

我有一个具有以下架构的集合:

{
  "_id" : 28,
  "n" : [{
      "a" : ObjectId("4ef8466e46b3b8140e000000"),
      "c" : 28,
      "p" : [ObjectId("4f00640646b3b88005000003"), ObjectId("4f00640146b3b88005000002"), ObjectId("4f00637d46b3b8cc0e000001"), ObjectId("4f00638046b3b8cc0e000002"), ObjectId("4f00638246b3b8cc0e000003"), ObjectId("4f00631646b3b85002000001"), ObjectId("4f00631846b3b85002000002")],
      "u" : 26
    }, {
      "a" : ObjectId("4ef8466e46b3b8140e000000"),
      "c" : 10,
      "p" : [ObjectId("4f00640146b3b88005000002"), ObjectId("4f0063fd46b3b88005000001")],
      "u" : 26
    }, {
      "a" : ObjectId("4ef8467846b3b8780d000001"),
      "u" : 26,
      "p" : [ObjectId("4f00637b46b3b8cc0e000000")],
      "c" : 28
    }, {
      "a" : ObjectId("4ef85a3e46b3b84408000000"),
      "u" : 26,
      "p" : [ObjectId("4f00631046b3b85002000000")],
      "c" : 28
    }]
}

我需要用 _id = 28 更新文档中数组中的一个元素 但前提是 a = 某个值且 c = 某个值

db.coll.update({
'_id' : 28,
'n.a' : new ObjectId('4ef85a3e46b3b84408000000'),
'n.c' : 28
},
{
  $push : {
     'n.$.p' : ObjectId("4b97e62bf1d8c7152c9ccb74")
  },
  $set : {
     'n.$.t' : ISODate("2013-05-13T14:22:46.777Z")
  }
})

所以基本上我想更新数组中的特定元素: 就我们所见,这是第四个要素。问题是当查询执行时,它很可能会更新第一个元素。

我该如何解决?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    您的代码中的问题是dot-notation,因为当您指定点表示法时,您假定指定的过滤条件必须与满足所有条件的单个数组元素匹配。但它没有。如果任何单个条件匹配,则数组上的点符号可以拾取任何数组元素。这就是您收到意外更新的原因。

    您必须使用$elemMatch 来匹配array 元素中的所有过滤器。

    db.coll.update({
    '_id' : 28,
    n: { 
       $elemMatch:{
           a : new ObjectId('4ef85a3e46b3b84408000000'),
           c : 28 }
       }
    },
    {
      $push : {
         'n.$.p' : ObjectId("4b97e62bf1d8c7152c9ccb74")
      },
      $set : {
         'n.$.t' : ISODate("2013-05-13T14:22:46.777Z")
      }
    })
    

    输出是

        {
            "a" : ObjectId("4ef85a3e46b3b84408000000"),
            "c" : 28,
            "p" : [
                ObjectId("4f00631046b3b85002000000"),
                ObjectId("4b97e62bf1d8c7152c9ccb74")
            ],
            "t" : ISODate("2013-05-13T14:22:46.777Z"),
            "u" : 26
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      • 2016-11-14
      • 2022-11-02
      • 2017-12-16
      相关资源
      最近更新 更多