根据MongoDB 文档:
批量操作规模
批量操作最多可以有1000次操作.
但是,使用Mongo 2.6批量操作API和node-mongodb-native(collection.initializeUnorderedBulkOp()等),我能够使用大得多的操作数(大约300k操作)
这个限制是否已过时,或者我只是遗漏了什么?你知道什么是真正的限制吗?
可以在MongoDB中进行批量更新/ upsert(不插入)吗?
如果是,请指出任何与此相关的文档?
谢谢
我有一些这样的数据:
data = [{'_id': 1, 'val': 5},
{'_id': 2, 'val': 1}}]
Run Code Online (Sandbox Code Playgroud)
db中的当前数据:
>>> db.collection.find_one()
{'_id': 1, 'val': 3}
Run Code Online (Sandbox Code Playgroud)
我总是收到唯一的行但不确定它们中是否存在任何行(例如上面的情况).我想根据两种类型的要求更新它们.
要求1:
千万不要,如果更新的行_id已经存在.这在某种程度上很容易:
from pymongo.errors import BulkWriteError
try:
db.collection.insert_many(data, unordered=False)
except BulkWriteError:
pass
Run Code Online (Sandbox Code Playgroud)
执行上面的操作会插入2nd行,但不会更新第一行; 但它也提出了例外.
1.有没有更好的方法进行上述操作(批量插入)?
要求2
这类似于update_if_exists和insert if not exists组合.所以以下数据:
data2 = [{'_id': 1, 'val': 9},
{'_id': 3, 'val': 4}}]
Run Code Online (Sandbox Code Playgroud)
应该用行更新行_id=1并2nd在DB中插入行.
问题是我一次得到数千行,并且不确定逐个检查和更新是否有效.
2. MongoDB中是否可以在不迭代每行并且操作尽可能少的情况下满足此要求?
我想insert_many()在我的收藏中提供文件.其中一些可能screen_name与集合中的现有文档具有相同的键/值对(在我的示例中).我在此密钥上设置了唯一的索引,因此出现错误.
my_collection.create_index("screen_name", unique = True)
my_collection.insert_one({"screen_name":"user1", "foobar":"lalala"})
# no problem
to_insert = [
{"screen_name":"user1", "foobar":"foo"},
{"screen_name":"user2", "foobar":"bar"}
]
my_collection.insert_many(to_insert)
# error :
# File "C:\Program Files\Python\Anaconda3\lib\site-packages\pymongo\bulk.py", line 331, in execute_command
# raise BulkWriteError(full_result)
#
# BulkWriteError: batch op errors occurred
Run Code Online (Sandbox Code Playgroud)
我想 :
{"screen_name":"user1", "foobar":"lalala"}){"screen_name":"user2", "foobar":"bar"})编辑:正如有人在评论中所说的那样"这个问题是询问如何进行批量插入并忽略唯一索引错误,同时仍然插入成功的记录.因此,如何批量插入问题并不重复".请重新打开它.