【问题标题】:Add ascending serial number field to all existing mongodb documents in a collection将升序序列号字段添加到集合中的所有现有 mongodb 文档
【发布时间】:2020-10-01 05:08:15
【问题描述】:

我有一个看起来像这样的 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


    【解决方案1】:

    首先你需要找到集合中的所有_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)
    

    【讨论】:

      【解决方案2】:

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

      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 开始..
      猜你喜欢
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      • 2020-07-04
      • 2021-12-08
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多