Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.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
Python 如何将项目推送到数组中,并在MongoDB中获取该项目的索引,在find_one_和_update pymongo中进行投影_Python_Mongodb_Mongodb Query_Pymongo - Fatal编程技术网

Python 如何将项目推送到数组中,并在MongoDB中获取该项目的索引,在find_one_和_update pymongo中进行投影

Python 如何将项目推送到数组中,并在MongoDB中获取该项目的索引,在find_one_和_update pymongo中进行投影,python,mongodb,mongodb-query,pymongo,Python,Mongodb,Mongodb Query,Pymongo,我想$push一个项目到一个数组中,并确定它插入的索引。我怎么能和Mongo一起做这个 我需要它是原子的,因为多个推送可以在文档上并行发生 我使用Python/PyMongo作为驱动程序。在MongoDB中对单个文档的更新是无效的,因此,如果一个更新操作正在写入文档,那么下面的更新操作必须等到第一个更新操作完成。因此,您可以返回更新的文档&在代码中获取新推送的值的索引,因为$push通常会推送到数组的末尾 因此,当您使用MongoDB的聚合框架进行读取时,您可以使用带有$project stag

我想$push一个项目到一个数组中,并确定它插入的索引。我怎么能和Mongo一起做这个

我需要它是原子的,因为多个推送可以在文档上并行发生


我使用Python/PyMongo作为驱动程序。

在MongoDB中对单个文档的更新是无效的,因此,如果一个更新操作正在写入文档,那么下面的更新操作必须等到第一个更新操作完成。因此,您可以返回更新的文档&在代码中获取新推送的值的索引,因为$push通常会推送到数组的末尾

因此,当您使用MongoDB的聚合框架进行读取时,您可以使用带有$project stage的运算符来获取数组中元素的索引。但投影是聚合框架可以接受比.find或.findOneAndUpdate中的投影多得多的运算符。使用更新操作可能无法获取数组中元素的索引,因此使用下面的查询可以从更新的文档返回完整的新数组&使用python尝试获取新数组中元素的索引

样本文件:

查询:

输出:


Ref:

MongoDB中对单个文档的更新是不正确的,因此,如果一个更新操作正在写入文档,则以下更新操作必须等待第一个更新操作完成。因此,您可以返回更新的文档&在代码中获取新推送的值的索引,因为$push通常会推送到数组的末尾

因此,当您使用MongoDB的聚合框架进行读取时,您可以使用带有$project stage的运算符来获取数组中元素的索引。但投影是聚合框架可以接受比.find或.findOneAndUpdate中的投影多得多的运算符。使用更新操作可能无法获取数组中元素的索引,因此使用下面的查询可以从更新的文档返回完整的新数组&使用python尝试获取新数组中元素的索引

样本文件:

查询:

输出:


Ref:

您可以将数组的大小与数组一起存储在文档中,并在更新后获得该值:

示例输入文档:{'\u id:1','arr':[apple,orange]}

更新操作-使用MongoDB 4.2版提供的更新管道:

NEW_ITEM = 'pear'

r = collection.find_one_and_update(
  { '_id': 1 },
  [
    { 
      '$set': { 
        'ix': { '$size': '$arr' }, 
        'arr': { '$concatArrays': [ '$arr', [ NEW_ITEM ] ] } 
      } 
    }
  ],
  projection = { '_id': False, 'ix': True }, 
  return_document = ReturnDocument.AFTER
)
另一种方法是在同一更新操作中设置新插入元素的索引。如果数组元素是唯一的,则可以使用该方法:

  [
    { 
      '$set': { 
        'arr': { '$concatArrays': [ '$arr', [ NEW_ITEM ] ] } 
      },
      '$set': { 
        'ix': { '$indexOfArray': [ '$arr', NEW_ITEM ] } 
      }
    }
  ]

您可以将数组的大小与数组一起存储在文档中,并在更新后获取该值:

示例输入文档:{'\u id:1','arr':[apple,orange]}

更新操作-使用MongoDB 4.2版提供的更新管道:

NEW_ITEM = 'pear'

r = collection.find_one_and_update(
  { '_id': 1 },
  [
    { 
      '$set': { 
        'ix': { '$size': '$arr' }, 
        'arr': { '$concatArrays': [ '$arr', [ NEW_ITEM ] ] } 
      } 
    }
  ],
  projection = { '_id': False, 'ix': True }, 
  return_document = ReturnDocument.AFTER
)
另一种方法是在同一更新操作中设置新插入元素的索引。如果数组元素是唯一的,则可以使用该方法:

  [
    { 
      '$set': { 
        'arr': { '$concatArrays': [ '$arr', [ NEW_ITEM ] ] } 
      },
      '$set': { 
        'ix': { '$indexOfArray': [ '$arr', NEW_ITEM ] } 
      }
    }
  ]

看起来不错,但是我怎么知道大小是在更新数组之后还是之前?更新操作是原子的-不管有多少字段、数组。嵌入对象是新创建的、更新的或从现有文档中删除的。看起来不错,但我如何知道大小是在更新数组之后还是之前确定的?更新操作是原子的-不管有多少字段、数组。嵌入对象是新创建、更新或从现有文档中删除的对象。
  [
    { 
      '$set': { 
        'arr': { '$concatArrays': [ '$arr', [ NEW_ITEM ] ] } 
      },
      '$set': { 
        'ix': { '$indexOfArray': [ '$arr', NEW_ITEM ] } 
      }
    }
  ]