是的,這是可能的!如果要取消設置集合中多個文檔的已知字段以外的所有字段,最好的方法是使用「批量」操作。
MongoDB 3.2棄用Bulk()
及其相關方法。所以如果你應該使用.bulk_write()
。
from itertools import zip_longest # or izip_longest in Python 2.x
from pymongo import MongoClient, UpdateOne
client = MongoClient()
db = client.db
collection = db.collection
requests = []
fields = ['name', '_id']
for document in collection.find():
unset_op = dict(zip_longest(set(document.keys()).difference(fields), [''], fill_value=''))
requests.append(UpdateOne({'_id': document['_id']}, {'$unset': unset_op}))
# Execute per 1000 operations and re-init.
if len(requests) == 1000:
collection.bulk_write(requests)
requests = []
# clean up the queues
if requests:
collection.bulk_write(requests)
對於您需要使用find_one
方法,該方法返回如果您沒有使用最新的符合您的條件,然後replace_one
新版本3.0
document = collection.find_one({'_id': 111})
collection.replace_one({'_id': document['_id']}, dict(zip(fields, [document[field] for field in fields])))
文檔一個文檔版本的MongoDB或Pymongo驅動程序,您需要使用Bulk()
API。
bulk = collection.initialize_unordered_bulk_op()
count = 0
for document in collection.find():
unset_op = dict(zip_longest(set(document.keys()).difference(fields), [''], fill_value=''))
bulk.find({'_id': document['_id']}).update_one({'$unset': unset_op})
count = count + 1
if count % 1000 == 0:
bulk.execute()
bulk = collection.initialize_unordered_bulk_op()
if count > 0:
bulk.execute()
對於單個文檔,您可以依賴於update_one
方法。
unset_op = dict(izip_longest(set(document.keys()).difference(fields), [''], fill_value=''))
collection.update_one({'_id': document['_id']}, {'$unset': unset_op})
是的,這是可能的。我還爲這個問題添加了一個答案,以顯示如何在shell中執行此操作。 – styvane