【问题标题】:Update inner array's element in array of arrays in mongodb在mongodb的数组数组中更新内部数组的元素
【发布时间】:2018-02-22 08:19:48
【问题描述】:

我有以下 mongodb 文档结构:

{
    "_id" : "c6b8S5Rx8xZiL42WS",
    "rows" : [
                [
                        {
                                "row" : 1,
                                "col" : 1,
                                "reserved" : false
                        },
                        {
                                "row" : 1,
                                "col" : 2,
                                "reserved" : false
                        },
                ],
                [
                        {
                                "row" : 2,
                                "col" : 1,
                                "reserved" : true
                        },
                        {
                                "row" : 2,
                                "col" : 2,
                                "reserved" : false
                        },
                ],
            ]
}
  • 是否有可能以某种方式更新例如内部对象 row=1col=1 在此文档中?
  • 或者我应该只是更改整个文档的结构/也许创建一个 新系列?

【问题讨论】:

  • 你的 mongo 版本是什么?
  • 这是 Mongo 3.4.5,很遗憾我无法更新,因为我正在使用一个名为 Meteor.js 的框架,它使用它自己支持的 mongo 版本

标签: mongodb mongodb-query


【解决方案1】:

您可以尝试以下更新。

注意使用双精度$elemMatch 来访问嵌套数组,并使用带有$set 和索引变量的位置运算符来更新内部数组元素。

位置运算符返回外部数组的索引。

db.col.update(
  {
    "_id": "c6b8S5Rx8xZiL42WS",
    "rows": {
      "$elemMatch": {
        "$elemMatch": {
          "row": 1,
          "col": 1
        }
      }
    }
  },
 { "$set": { ['rows.$.' + index + '.reserved']: true } } 
)

【讨论】:

  • 由于某种原因它与文档匹配但它没有为我更新它,它说: { "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 }
  • 您使用了哪个查询?使用第一个
  • 我使用了第一个,但我认为我做错了什么。这是我想要实现的目标:我想在不修改文档结构的情况下将内部对象的保留字段更新为 true where row=1, col=1。我应该如何修改您的查询?
  • 对不起,我把你的问题和其他问题混为一谈了。在 3.4 中无法进行深度更新,但您可以尝试db.col.update( { "_id": "c6b8S5Rx8xZiL42WS", "rows": { "$elemMatch": { "$elemMatch": { "row": 1, "col": 1 } } } }, { "$set": { "rows.$.0.reserved": true } } ) 之类的方法。注意我使用 0 索引来引用内部数组中的第一个元素。因此,如果您具有这种灵活性,它可能适用于您的用例,或者您可以以更易于更新的方式对集合进行建模。
  • 这对我有用,但我必须根据参数使“rows.$.0.reserved”中的“0”成为动态的,因为我是从一个功能。这可能吗?
猜你喜欢
  • 2020-04-18
  • 2013-09-07
  • 2014-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
相关资源
最近更新 更多