- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我目前正在尝试编写一个脚本,将文档插入 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) .
这里有什么选项吗?
最佳答案
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 - 在 insert_many() 失败后获取插入的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35191042/
我就废话不多说了,大家还是直接看代码吧~ ? 1
我正在尝试将以下名为 posts 的字典列表插入到 mongo 中,但出现了一个 BulkWriteError: batch op errors occurred 错误,我不知道该怎么做修复。 帖子:
在将 insert_many 与 pymongo 一起使用时,我需要忽略重复插入,其中重复项基于索引。我在 stackoverflow 上看到过这个问题,但没有看到有用的答案。 这是我的代码片段: t
我目前正在尝试使用 C++ 应用程序最大限度地提高插入的写入速度到 MongoDB 中。我看到的行为是 insert_many() 操作会变慢,导致写队列建立,然后后续的 insert_many()
我目前正在尝试编写一个脚本,将文档插入 MongoDb 并返回每个元素的存储位置。非常简单,感谢 insert_many(),但是如果我在插入时出现错误,我的问题就会出现。 我将无法获取刚刚插入的 I
我想在我的集合中insert_many() 文件。其中一些可能与集合中的现有文档具有相同的键/值对(在我的示例中为 screen_name)。我在此键上设置了唯一索引,因此出现错误。 my_colle
mongo/pymongo 的新手。目前使用最新-v3.2.2 看起来 insert_many 没有按预期执行?我注意到,即使在为 db.col.insert_many 提供生成器时,内存使用量仍然会
这个问题在这里已经有了答案: Fast or Bulk Upsert in pymongo (6 个回答) 关闭3年前。 我有一些这样的数据: data = [{'_id': 1, 'val': 5}
我有一个包含 3 个成员的 MongoDB 副本集和一个在其中存储数据的 Python 应用程序。 当使用带有包装器的单个文档插入时,我可以处理 pymongo 的 AutoReconnect 异常,
作为练习,我从 API 中提取数据并将其插入到 psql 数据库中。我最初遵循每次拉取 1000 个条目的默认限制,但我决定尝试获取大约 40K 行的所有数据。经过一些实验后,我可以拉出 4800,但
我正在尝试将文档从一个数据库增量复制到另一个数据库。 某些字段包含以下格式的日期时间值: 2016-09-22 00:00:00 而其他的则采用这种格式: 2016-09-27 09:03:08.98
我正在使用一种方法将一些数据存储在 MongoDB 数据库中。 void save_data(std::vector list){ using namespace std; using
我正在更新一个包含数百万文档且 _id 冲突少于 10 个的数据库。 我目前正在使用 PyMongo 模块通过 insert_many 进行批量插入: 查询数据库以查看_id 是否存在 如果 _id
我是一名优秀的程序员,十分优秀!