在Mongo中更新字段类型

8 浏览
0 Comments

在Mongo中更新字段类型

我有一个在collection中的大量记录:

{field: [value]}

我该如何高效地更新为:

{field: value}

我尝试过类似这样的代码:(pymongo语法)

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

但显然这样不起作用。

由于记录数量庞大,逐个循环遍历并进行删除-插入的操作不可行。

0
0 Comments

问题的原因是,如果数组只有一个元素,那么更新操作无法成功,因为在JavaScript中(MongoDB受其影响),数组的第一个索引是0。解决方法是使用下面的代码进行更新操作:

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

这样,所有的`field`值都会被更新为字符串值`field.0`。这是否符合问题提出者的意图呢?

不,`field`将会被更新为字面字符串值`field.0`,而不是`field`数组的第一个元素。

0
0 Comments

更新MongoDB中字段类型的问题出现的原因是根据不同的MongoDB服务器版本和PyMongo版本,需要使用不同的方法来循环遍历游标并更新每个文档。解决方法是使用批量操作来提高效率。

从MongoDB 3.2开始,需要使用批量写操作和bulkWrite()方法来更新字段类型。以下是使用PyMongo 3.0驱动程序的查询示例:

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:
        db.collection.bulk_write(requests)
        requests = []
if len(requests) > 0:
    db.collection.bulk_write(requests)

从MongoDB 2.6开始,需要使用已弃用的Bulk API。以下是查询示例的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()

以上是更新MongoDB中字段类型的问题的出现原因和解决方法。

0