gpt4 book ai didi

python - 更新mongo中的字段类型

转载 作者:可可西里 更新时间:2023-11-01 09:12:12 24 4
gpt4 key购买 nike

我在集合中有大量记录:

{field: [value]}

我怎样才能有效地更新到:

{字段:值}

我试过这样的事情:(pymongo 语法)

collection.update({"field.1": {"$exists": True}},
{"$set": {'field': "field.1"}},
multi=True)

这显然不起作用。由于大量记录,循环遍历每条记录并删除-插入不是一种选择。

最佳答案

您需要遍历光标并使用 $set 更新运算符更新每个文档。当然,要做到这一点,您可以使用“批量”操作以获得最大效率。也就是说,该方法将根据您的 MongoDB 服务器版本和 PyMongo 版本而有所不同。

从 MongoDB 3.2 开始,您需要使用 Bulk Write OperationsbulkWrite()方法。

var requests = [];
var cursor = db.collection.find( { "field.1": { "$exists": true } }, { "field": 1 } );
cursor.forEach( document => {
requests.push({
"updateOne": {
"filter" : { "_id": document._id },
"update" : { "field": { "$set": document.field[0] } }
}
});
if (requests.length === 1000) {
db.collection.bulkWrite(requests);
requests = [];
}
});

if (requests.length > 0) {
db.collection.bulkWrite(requests);
}

此查询使用 PyMongo 3.0 驱动程序,它提供了您需要使用的 bulk_write()方法给出以下内容:

from pymongo import UpdateOne


requests = [];
cursor = db.collection.find({"field.1": {"$exists": True}}, {"field": 1})
for document in cursor:
requests.append(UpdateOne({'_id': document['_id']}, {'$set': {'field': document['field'][0]}}))
if len(requests) == 1000:
# Execute per 1000 operations
db.collection.bulk_write(requests)
requests = []
if len(requests) > 0:

# clean up queues
db.collection.bulk_write(requests)

从 MongoDB 2.6 开始,您需要使用现已弃用的 Bulk API。

var bulk = db.collection.initializeUnorderedBulkOp();
var count = 0;

// cursor is the same as in the previous version using MongoDB 3.2
cursor.forEach(function(document) {
bulk.find( { "_id": document._id } ).updateOne( { "$set": { "field": document.field[0] } } );
count++;
if (count % 1000 === 0) {
bulk.execute();
bulk = db.collection.initializedUnorderedBulkOp();
}
});

// Again clean up queues
if (count > 0 ) {
bulk.execute();
}

翻译成 Python 给出以下内容。

bulk = db.collection.initialize_unordered_bulk_op()
count = 0

for doc in cursor:
bulk.find({'_id': doc['_id']}).update_one({'$set': {'field': doc['field'][0]}})
count = count + 1
if count == 1000:
bulk.execute()
bulk = db.collection.initialize_unordered_bulk_op()

if count > 0:
bulk.execute()

关于python - 更新mongo中的字段类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36429475/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com