当更新嵌套数组的字段时,如何使 mongodb 的“更新”停止?

2024-02-07

我有一个这样的数据库:

  {
        "universe":"comics",
        "saga":[
           {
              "name":"x-men",
              "characters":[
                 {
                    "character":"wolverine",
                    "picture":"618035022351.png"
                 },
                 {
                    "character":"wolverine",
                    "picture":"618035022352.png"
                 }
              ]
           }
        ]
     },
     {
        "universe":"dc",
        "saga":[
           {
              "name":"spiderman",
              "characters":[
                 {
                    "character":"venom",
                    "picture":"618035022353.png"
                 }
              ]
           }
        ]
     }

通过这段代码,我更新了该字段name: wolverine:

db.getCollection('collection').findOneAndUpdate(
  {
    "universe": "comics"
  },
  {
    $set: {
      "saga.$[outer].characters.$[inner].character": "lobezno",
      "saga.$[outer].characters.$[inner].picture": "618035022354.png"
    }
  },
  /*{
    "saga.characters": 1
  },*/
  {
    "arrayFilters": [
      {
        "outer.name": "x-men"
      },
      {
        "inner.character": "wolverine"
      }
    ],
      "multi":false
  }

)

我只想更新第一个匹配的对象,然后停止它。

例如,如果我有一个包含 100,000 个元素的数组,并且匹配的对象位于第十个位置,他将更新该记录,但他将继续遍历整个数组,这对我来说似乎无效,即使他已经做了更新。

注意:如果我使用_id代替 universe.saga.characters而不是使用进行更新name,它仍然会循环遍历其余元素。

我该怎么做?


更新使用arrayFilters状况

我不认为它会通过循环查找和更新,并且集合是否有 100,000 个子文档并不重要,因为这里有很好的解释$[] https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/#up._S_%5B%3Cidentifier%3E%5D并提到:

  • The $[<identifier>]定义一个标识符,仅更新那些与相应过滤器文档匹配的数组元素arrayFilters

  • 在更新文档中,使用$[<identifier>]过滤位置运算符来定义标识符,然后您可以在数组过滤器文档中引用该标识符。但是,如果更新文档中未包含标识符,请确保您无法拥有该标识符的数组过滤器文档。

更新使用_id

你的观点,

注意:如果我使用_id代替universe.saga.characters它仍然会循环遍历其余元素,而不是使用名称进行更新。

MongoDB 肯定会使用_id指数。这是不错的answer https://stackoverflow.com/a/42003815/8987128就问题而言MongoDB 更新查询性能 https://stackoverflow.com/questions/42000950/mongo-db-update-query-performance,由此你会对上面的观点有更好的了解

使用索引字段更新

您可以根据更新命令的查询部分创建索引,这里MongoDB 索引 https://docs.mongodb.com/manual/indexes/ and 索引策略 https://docs.mongodb.com/manual/applications/indexes/已经解释了为什么索引很重要,

在您的示例中,让我们看看示例:

示例1:如果文档有 2 个子文档,并且当您更新并检查时解释(“执行统计”) https://docs.mongodb.com/master/reference/method/db.collection.explain/index.html,假设更新需要 1 秒,

快速使用蒙戈游乐场 https://mongoplayground.net/p/MV24OzyEeG9 (本平台暂不支持更新查询)

示例2:如果文档有 1000 个子文档并且当您更新并检查时解释(“执行统计”) https://docs.mongodb.com/master/reference/method/db.collection.explain/index.html,可能需要超过 1 秒,

如果提供字段索引 (universe, saga.characters.character and saga.characters.picture)那么肯定会比没有索引的情况花费更少的时间,索引的主要好处是它将直接指向索引字段。

快速使用蒙戈游乐场 https://mongoplayground.net/p/vK99sJmbrjb (本平台暂不支持更新查询)

为您的字段创建索引

db.maxData.createIndex({ 
    "universe": 1, 
    "saga.characters.character": 1, 
    "saga.characters.picture": 1
})

如需更多实验,请使用上面 2 个带索引和不带索引的示例数据并检查executionStats你会变得更加清晰。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当更新嵌套数组的字段时,如何使 mongodb 的“更新”停止? 的相关文章

随机推荐