将升序序列号字段添加到集合中的所有现有 mongodb 文档
Add ascending serial number field to all existing mongodb documents in a collection
我有一个 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。
首先需要找到集合中所有的_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)
您可以通过将所有文档分组到一个数组中,然后使用包含的元素索引展开它来使用单个聚合查询来完成此操作:
db.collection.aggregate([
{
$group: {
_id: null,
doc: {
$push: "$$ROOT"
}
}
},
{
$unwind: {
path: "$doc",
includeArrayIndex: "doc.Serial"
}
},
{
$replaceRoot: {
newRoot: "$doc"
}
},
{
$out: "new_collection_name"
}
])
所有工作都在服务器端完成,无需将整个集合加载到应用程序的内存中。如果集合足够大,您可能需要使用 "allowDiskUse" 调用聚合。
如果需要,在其前面加上排序阶段以确保预期的顺序。
我有一个 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。
首先需要找到集合中所有的_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)
您可以通过将所有文档分组到一个数组中,然后使用包含的元素索引展开它来使用单个聚合查询来完成此操作:
db.collection.aggregate([
{
$group: {
_id: null,
doc: {
$push: "$$ROOT"
}
}
},
{
$unwind: {
path: "$doc",
includeArrayIndex: "doc.Serial"
}
},
{
$replaceRoot: {
newRoot: "$doc"
}
},
{
$out: "new_collection_name"
}
])
所有工作都在服务器端完成,无需将整个集合加载到应用程序的内存中。如果集合足够大,您可能需要使用 "allowDiskUse" 调用聚合。
如果需要,在其前面加上排序阶段以确保预期的顺序。