Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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文档添加升序序列号字段_Python_Python 3.x_Mongodb_Pymongo_Mongoengine - Fatal编程技术网

Python 向集合中的所有现有mongodb文档添加升序序列号字段

Python 向集合中的所有现有mongodb文档添加升序序列号字段,python,python-3.x,mongodb,pymongo,mongoengine,Python,Python 3.x,Mongodb,Pymongo,Mongoengine,我有一个mongodb集合,看起来像这样 [ { "Code": "018906", "X": "0.12", }, { "Code": "018907", "X": "0.18", }, { "Code": "018910", "X": "0.24", }, { "Code": "018916", "X": "0.75", }, ] [ { "Serial": 1, "Code

我有一个mongodb集合,看起来像这样

[
  {
    "Code": "018906",
    "X": "0.12",
  },
  {
    "Code": "018907",
    "X": "0.18",
  },
  {
    "Code": "018910",
    "X": "0.24",
  },
  {
    "Code": "018916",
    "X": "0.75",
  },
]
[
  {
    "Serial": 1,
    "Code": "018906",
    "X": "0.12",
  },
  {
    "Serial": 2,
    "Code": "018907",
    "X": "0.18",
  },
  {
    "Serial": 3,
    "Code": "018910",
    "X": "0.24",
  },
  {
    "Serial": 4,
    "Code": "018916",
    "X": "0.75",
  },
]
我想向集合中所有现有的mongodb文档添加一个升序序列号字段。添加后,新集合将如下所示:

[
  {
    "Code": "018906",
    "X": "0.12",
  },
  {
    "Code": "018907",
    "X": "0.18",
  },
  {
    "Code": "018910",
    "X": "0.24",
  },
  {
    "Code": "018916",
    "X": "0.75",
  },
]
[
  {
    "Serial": 1,
    "Code": "018906",
    "X": "0.12",
  },
  {
    "Serial": 2,
    "Code": "018907",
    "X": "0.18",
  },
  {
    "Serial": 3,
    "Code": "018910",
    "X": "0.24",
  },
  {
    "Serial": 4,
    "Code": "018916",
    "X": "0.75",
  },
]
我愿意使用任何python mongodb库,如pymongo或mongoengine


我使用的是python 3.7、mongodb v4.2

首先需要在集合中找到所有
\u id
,并使用批量写入操作

来自pymongo导入更新
records=db.collection.find({},{''u id':1})
i=1
请求=[]
记录中的记录:
append(UpdateOne({uid':record[''uid']},{'$set':{'serial':i}))
i=i+1
db.collection.bulk_write(请求)

您可以使用单个聚合查询来完成此操作,方法是将所有文档分组到单个数组中,然后使用包含元素索引的方法将其展开:

db.collection.aggregate([
  {
    $group: {
      _id: null,
      doc: {
        $push: "$$ROOT"
      }
    }
  },
  {
    $unwind: {
      path: "$doc",
      includeArrayIndex: "doc.Serial"
    }
  },
  {
    $replaceRoot: {
      newRoot: "$doc"
    }
  },
  {
    $out: "new_collection_name"
  }
])
所有工作都在服务器端完成,无需将整个集合加载到应用程序的内存中。如果集合足够大,则可能需要使用“allowDiskUse”调用聚合


如果需要,请在其前面添加排序阶段,以确保预期的顺序。

是的,
$out
不需要读取文档&我同意这会添加一个带有升序序列号的新字段,这是所需的,但OP需要知道的是它从0开始。。