在insert_many()失败后获取插入的ID

渣打银行

我目前正在尝试编写一个脚本,该脚本将文档插入MongoDb并返回每个元素的存储位置。非常感谢您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不会被初始化(并且无论如何也不会可靠地返回ID)。

这里有什么选择吗?

shx2

pymongo在将_id字段发送到服务器之前在客户端设置该字段它会修改你传递文件的地方

这意味着您传递的所有文档都保留有_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所述。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

尝试获取插入值后获取的返回ID,但mysqli_insert_id()返回null

来自分类Dev

大量插入后,cassandra INSERT失败:“操作超时”

来自分类Dev

在Spring中插入后获取ID

来自分类Dev

助力车:插入后获取ID

来自分类Dev

插入行后从游标获取生成的ID

来自分类Dev

Ruby Mongo-插入后获取ID

来自分类Dev

插入关联表后获取最后插入的ID

来自分类Dev

插入关联表后获取最后插入的ID

来自分类Dev

Spring MongoDB在保存后获取插入项目的ID

来自分类Dev

在reactmongo中插入后如何获取文档对象ID?

来自分类Dev

插入后,重定向到编辑页面。无法获取ID

来自分类Dev

Android:插入后获取联系人ID

来自分类Dev

插入后在Entity Framework 5中获取记录ID

来自分类Dev

失败后插入的每个循环

来自分类Dev

失败后插入的每个循环

来自分类Dev

在php中使用PDO transactino插入后如何获取插入ID

来自分类Dev

使用多列主键插入MySQL表后如何获取最后插入的ID

来自分类Dev

如何在codeigniter中插入查询后获取最后的插入ID

来自分类Dev

获取插入行的ID

来自分类Dev

获取插入的ID MYSQL

来自分类Dev

获取插入行的ID

来自分类Dev

获取最后插入的ID

来自分类Dev

获取插入的ID MYSQL

来自分类Dev

如何获取最后插入的ID。mysql_insert_id()不起作用

来自分类Dev

从 mysqli_insert_id 获取多个 ID 并将它们插入到 URL

来自分类Dev

将数据插入表中以获取SQLite后如何获取最后一行ID

来自分类Dev

如何在插入后不插入相关数据的情况下获取插入的行ID和相关数据

来自分类Dev

插入后LAST_INSERT_ID上的无效描述符索引

来自分类Dev

从条件INSERT获取ID