Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我怎样才能使;更新的「;更新嵌套数组的字段时是否停止mongodb的操作?_Mongodb - Fatal编程技术网

我怎样才能使;更新的「;更新嵌套数组的字段时是否停止mongodb的操作?

我怎样才能使;更新的「;更新嵌套数组的字段时是否停止mongodb的操作?,mongodb,Mongodb,我有这样一个数据库: { "universe":"comics", "saga":[ { "name":"x-men", "characters":[ { "character&qu

我有这样一个数据库:

  {
        "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
  }

)
我只想更新第一个匹配的对象,并停止它

例如,如果我有一个100000个元素的数组,匹配的对象位于第十位,他将更新该记录,但他将继续遍历整个数组,这对我来说似乎无效,即使他已经进行了更新

注意:如果我在
universe.saga.characters
中使用
\u id
进行更新,而不是使用
名称
进行更新,那么它仍然会在其余元素中循环

如何操作?

使用
arrayFilters
条件更新 我认为它不会通过循环查找和更新,而且集合中是否有100000个子文档也无关紧要,因为这里有一个很好的解释,并且已经提到:

  • $[]
    定义一个标识符,以仅更新那些与
    arrayFilters中的相应筛选器文档匹配的数组元素

  • 在更新文档中,使用
    $[]
    筛选位置运算符定义标识符,然后在数组筛选文档中引用该标识符。但是,如果标识符未包含在更新文档中,请确保不能为标识符创建数组筛选器文档

使用
\u id
你的观点

注意:如果我在
universe.saga.characters
中使用
\u id
进行更新,而不是使用名称进行更新,那么它仍然会在其余元素中循环

MongoDB肯定会使用
\u id
索引。这是一个很好的问题,从这一点上你会得到一个更好的想法

使用索引字段更新 您可以根据update命令的查询部分创建索引,这里已经解释了为什么索引很重要

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

示例1:如果文档有两个子文档,当您更新并检查时,假设更新需要1秒

快速使用(此平台不支持更新查询)

示例2:如果文档有1000个子文档,当您更新并检查时,可能需要1秒以上的时间

如果在字段上提供索引(
universe
saga.characters.character
saga.characters.picture
),那么肯定会比没有索引的情况下花费更少的时间,索引的主要优点是它将指向索引字段

快速使用(此平台不支持更新查询)

为字段创建索引 要进行更多的实验,请使用以上两个示例数据(带索引和不带索引),并检查
executionStats
,您将获得更清晰的信息


哇,你真棒,这是很多有价值的信息。请原谅我的无知,但更清楚地说,我总结了这个问题:1-即使您使用
\u id
在嵌套数组中进行更新,其余元素是否会跟随循环,即使它找到了匹配项?我真的不知道更新的内部机制,它将如何搜索更新,但他们肯定会考虑这类问题,我的想法是“即使使用_id在嵌套数组中进行更新,其余元素是否会跟随循环”因为他们为什么提供了
updateOne
功能?当first查找并更新时,可能会停止搜索。似乎难以置信,没有类似的文档。继续搜索,如果您发现任何内容,请更新,可能是我错了,或者添加的信息不完整,或者无法搜索相关信息。
db.maxData.createIndex({ 
    "universe": 1, 
    "saga.characters.character": 1, 
    "saga.characters.picture": 1
})