将升序编号字段添加到集合中所有现有的mongodb文档中

问题描述 投票:0回答:2

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

[
  {
    "Code": "018906",
    "X": "0.12",
  },
  {
    "Code": "018907",
    "X": "0.18",
  },
  {
    "Code": "018910",
    "X": "0.24",
  },
  {
    "Code": "018916",
    "X": "0.75",
  },
]

我想向集合内所有现有的mongodb文档中添加一个升序序列号字段。添加后,新集合将如下所示;

[
  {
    "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。

python python-3.x mongodb pymongo mongoengine
2个回答
0
投票

首先,您需要找到集合中的所有_id,并使用批量写入操作。

from pymongo import UpdateOne


records = db.collection.find({}, {'_id':1})
i = 1
request = []

for record in records:
    request.append(UpdateOne({'_id': record['_id']}, {'$set': {'serial': i}}))
    i=i+1

db.collection.bulk_write(request)

0
投票

您可以通过单个聚集查询来完成此任务,方法是将所有文档分组为一个数组,然后使用包含的元素索引对其进行展开:

db.collection.aggregate([
  {
    $group: {
      _id: null,
      doc: {
        $push: "$$ROOT"
      }
    }
  },
  {
    $unwind: {
      path: "$doc",
      includeArrayIndex: "doc.Serial"
    }
  },
  {
    $replaceRoot: {
      newRoot: "$doc"
    }
  },
  {
    $out: "new_collection_name"
  }
])

所有工作都在服务器端完成,无需将整个集合加载到应用程序的内存中。如果集合足够大,则可能需要使用“ allowDiskUse”调用聚合。

在排序阶段前添加它,以确保期望的顺序。

© www.soinside.com 2019 - 2024. All rights reserved.