失败后获取插入的 ID insert_many()
Get inserted ids after failed insert_many()
我目前正在尝试编写一个脚本,将文档插入到存储每个元素的 MongoDb 和 return 中。感谢 insert_many()
,非常简单,但是如果我在插入时出现错误,我的问题就会出现。
我将无法获取刚刚插入的 ID。
from pymongo import MongoClient
client = MongoClient(...)
db = client.test
r = db.test.insert_many([{'foo': 1}, {'foo': 2}, {'foo': 3}])
r.inserted_ids
#: [ObjectId('56b2a592dfcce9001a6efff8'),
#: ObjectId('56b2a592dfcce9001a6efff9'),
#: ObjectId('56b2a592dfcce9001a6efffa')]
list(db.test.find())
#: [{'_id': ObjectId('56b2a592dfcce9001a6efff8'), 'foo': 1},
#: {'_id': ObjectId('56b2a592dfcce9001a6efff9'), 'foo': 2},
#: {'_id': ObjectId('56b2a592dfcce9001a6efffa'), 'foo': 3}]
# This is dead stupid, but forcing an error by re-using the ObjectId we just generated
r2 = db.test.insert_many([{'foo': 4}, {'_id': r.inserted_ids[0], 'foo': 6}, {'foo': 7}])
#: ---------------------------------------------------------------------------
#: BulkWriteError Traceback (most recent call last)
#: <Cut in the interest of time>
当然,r2
没有初始化,所以我不能要求inserted_ids
,但是,数据库中已经插入了一条记录:
list(db.test.find())
#: [{'_id': ObjectId('56b2a592dfcce9001a6efff8'), 'foo': 1},
#: {'_id': ObjectId('56b2a592dfcce9001a6efff9'), 'foo': 2},
#: {'_id': ObjectId('56b2a592dfcce9001a6efffa'), 'foo': 3},
#: {'_id': ObjectId('56b2a61cdfcce9001a6efffd'), 'foo': 4}]
我想要的是能够可靠地找出按顺序插入的 ID。像这样的东西:
r2.inserted_ids
#: [ObjectId('56b2a61cdfcce9001a6efffd'),
#: None, # or maybe even some specific error for this point.
#: None]
设置 ordered=False
仍然会出现错误,因此 r2
不会被初始化,(而且它不会可靠地 return 按照我给出的顺序排列 ID)。
这里有选项吗?
捕获抛出的异常。至少根据this site,返回的错误详细信息包括坏记录。这应该使您能够确定成功的记录。
pymongo sets the _id
field at client side,然后将其发送到服务器。它会修改您 就地 .
传递的文档
这意味着所有您传递的文档都留下了_id
字段集——成功的和失败的。
所以你只需要弄清楚哪些是成功的。这可以像@Austin 解释的那样完成。
类似于:
docs = [{'foo': 1}, {'foo': 2}, {'foo': 3}]
try:
r = db.test.insert_many(docs)
except pymongo.errors.OperationFailure as exc:
inserted_ids = [ doc['_id'] for doc in docs if not is_failed(doc, exc) ]
else:
inserted_ids = r.inserted_ids
is_failed(doc, exc)
可以通过在异常详细信息中的失败文档列表中搜索 doc
来实现,如@Austin 所述。
我目前正在尝试编写一个脚本,将文档插入到存储每个元素的 MongoDb 和 return 中。感谢 insert_many()
,非常简单,但是如果我在插入时出现错误,我的问题就会出现。
我将无法获取刚刚插入的 ID。
from pymongo import MongoClient
client = MongoClient(...)
db = client.test
r = db.test.insert_many([{'foo': 1}, {'foo': 2}, {'foo': 3}])
r.inserted_ids
#: [ObjectId('56b2a592dfcce9001a6efff8'),
#: ObjectId('56b2a592dfcce9001a6efff9'),
#: ObjectId('56b2a592dfcce9001a6efffa')]
list(db.test.find())
#: [{'_id': ObjectId('56b2a592dfcce9001a6efff8'), 'foo': 1},
#: {'_id': ObjectId('56b2a592dfcce9001a6efff9'), 'foo': 2},
#: {'_id': ObjectId('56b2a592dfcce9001a6efffa'), 'foo': 3}]
# This is dead stupid, but forcing an error by re-using the ObjectId we just generated
r2 = db.test.insert_many([{'foo': 4}, {'_id': r.inserted_ids[0], 'foo': 6}, {'foo': 7}])
#: ---------------------------------------------------------------------------
#: BulkWriteError Traceback (most recent call last)
#: <Cut in the interest of time>
当然,r2
没有初始化,所以我不能要求inserted_ids
,但是,数据库中已经插入了一条记录:
list(db.test.find())
#: [{'_id': ObjectId('56b2a592dfcce9001a6efff8'), 'foo': 1},
#: {'_id': ObjectId('56b2a592dfcce9001a6efff9'), 'foo': 2},
#: {'_id': ObjectId('56b2a592dfcce9001a6efffa'), 'foo': 3},
#: {'_id': ObjectId('56b2a61cdfcce9001a6efffd'), 'foo': 4}]
我想要的是能够可靠地找出按顺序插入的 ID。像这样的东西:
r2.inserted_ids
#: [ObjectId('56b2a61cdfcce9001a6efffd'),
#: None, # or maybe even some specific error for this point.
#: None]
设置 ordered=False
仍然会出现错误,因此 r2
不会被初始化,(而且它不会可靠地 return 按照我给出的顺序排列 ID)。
这里有选项吗?
捕获抛出的异常。至少根据this site,返回的错误详细信息包括坏记录。这应该使您能够确定成功的记录。
pymongo sets the _id
field at client side,然后将其发送到服务器。它会修改您 就地 .
这意味着所有您传递的文档都留下了_id
字段集——成功的和失败的。
所以你只需要弄清楚哪些是成功的。这可以像@Austin 解释的那样完成。
类似于:
docs = [{'foo': 1}, {'foo': 2}, {'foo': 3}]
try:
r = db.test.insert_many(docs)
except pymongo.errors.OperationFailure as exc:
inserted_ids = [ doc['_id'] for doc in docs if not is_failed(doc, exc) ]
else:
inserted_ids = r.inserted_ids
is_failed(doc, exc)
可以通过在异常详细信息中的失败文档列表中搜索 doc
来实现,如@Austin 所述。