如何使用 PyMongo 在重复键错误后继续插入

2024-05-15

如果我需要在 MongoDB 中插入尚不存在的文档

db_stock.update_one(document, {'$set': document}, upsert=True)

.将完成这项工作(如果我错了,请随时纠正我)

但是,如果我有一个文档列表并想将它们全部插入,最好的方法是什么?

有一个单记录版本question https://stackoverflow.com/questions/2801008/mongodb-insert-if-not-exists但我需要它的集体版本,所以它是不同的。

让我重新表述一下我的问题。我有数百万个文档,其中很少有可以存储的。如何在几秒钟内而不是几分钟/几小时内将剩余的数据存储在 MongoDB 中?


你需要使用insert_many http://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.insert_many方法并将有序选项设置为False.

db_stock.insert_many(<list of documents>)

正如在ordered选项文档:

ordered(可选):如果为 True(默认),文档将按提供的顺序连续插入到服务器上。如果发生错误,所有剩余的插入都会中止。如果为 False,文档将以任意顺序(可能是并行)插入到服务器上,并且将尝试所有文档插入。

这意味着即使存在重复键错误,插入也会继续。

Demo:

>>> c.insert_many([{'_id': 2}, {'_id': 3}])
<pymongo.results.InsertManyResult object at 0x7f5ca669ef30>
>>> list(c.find())
[{'_id': 2}, {'_id': 3}]
>>> try:
...     c.insert_many([{'_id': 2}, {'_id': 3}, {'_id': 4}, {'_id': 5}], ordered=False)
... except pymongo.errors.BulkWriteError:
...     list(c.find())
... 
[{'_id': 2}, {'_id': 3}, {'_id': 4}, {'_id': 5}]

正如你所看到的文档_id4、5 个被插入到集合中。


值得注意的是,这也可以在 shell 中使用insertMany https://docs.mongodb.com/manual/reference/method/db.collection.insertMany/方法。您所需要的只是设置未记录的选项ordered to false.

db.collection.insertMany(
    [ 
        { '_id': 2 }, 
        { '_id': 3 },
        { '_id': 4 }, 
        { '_id': 5 }
    ],
    { 'ordered': false }
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 PyMongo 在重复键错误后继续插入 的相关文章

随机推荐

  • SQL Server lat;lng varchar 分割过程用作 Lat 和 Lng 以提高搜索速度

    有人可以帮助我使用存储过程或函数来传递我的存储varchar表中的 lat lng 到各个字段作为浮点数作为 Lat 和 Lng 以在半径搜索中使用 lanlng in Table 33 0000 15 222222 Thanks 你只是想
  • 在sql plus脚本中运行循环

    我正在 sql plus 中运行脚本 我的脚本中有一个 for 循环 BEGIN FOR count IN 1 100 LOOP INSERT INTO CompanyShare VALUES count 1 250 END LOOP EN
  • 按多个键分组并对字典列表的值进行汇总/平均值

    在Python中按多个键进行分组并对字典列表进行汇总 平均值的最Pythonic方法是什么 假设我有一个字典列表 如下所示 input dept 001 sku foo transId uniqueId1 qty 100 dept 001
  • PDF Tj 命令带有尖括号?

    我试图弄清楚在哪里未压缩的PDF v1 4 文档使用 Times 字体 The Font描述 PDF 中 Times 字体的对象是 object65如下 65 0 obj lt Font Subtype TrueType BaseFont
  • jspm / jQuery / TypeScript - 模块“jquery”没有默认导出

    我正在尝试使用 TypeScript 和 jspm system js 来引导 Web 应用程序进行模块加载 我还没有走多远 安装 jspm 后 并使用它来安装 jQuery jspm install jquery 以及基础知识 main
  • reStructuredText:README.rst 未在 PyPI 上解析

    我有一个托管在 Github 和 PyPI 上的 Python 项目 在 Github 上 https github com sloria TextBlob blob master README rst https github com s
  • 自 2012 年 6 月 12 日以来,“未定义”随机附加在我网站上 1% 的请求网址中

    自 2012 年 6 月 12 日 11 20 TU 起 我在我的 varnish apache 日志中看到非常奇怪的错误 有时 当用户请求一页时 几秒钟后我会看到类似的请求 但 url 中最后一个 之后的所有字符串已被 未定义 替换 例子
  • 我如何从 iPhone 设备获取电子邮件历史记录..?

    friends 我想从我的 iPhone 访问电子邮件历史记录 并且还希望在收到新邮件时收到通知 如果可能的话 请向我提供源代码片段 Thanks 简而言之 使用任何已记录的 API 都是不可能的
  • 时间:2019-03-17 标签:c#ThreadSafeDeepCopy

    我一直在阅读很多其他问题以及大量谷歌搜索 但我一直无法找到明确的解决方案 根据我读过的一些最佳实践 类的静态方法应该创建线程安全的 并且实例成员应该将线程安全留给消费者 我想为该类实现深度复制方法 该类本身还有其他引用类型成员 有没有什么方
  • Authenticode 的替代时间戳服务

    我们为所有生产版本执行代码签名和时间戳 偶尔 通常是当我们即将 RTM Verisign 的时间戳服务器 http timestamp verisign com scripts timstamp dll http timestamp ver
  • Node.js:server.setTimeout、server.timeout 和 server.keepAliveTimeout 之间有什么区别

    官方文档是here https nodejs org api http html http server settimeout msecs callback server setTimeout 中没有提及有关服务下一个请求的信息 所以我认为
  • 将数组中的所有元素相乘

    我在这里找不到我真正想要的例子 我想将所有数组元素相乘 因此如果数组包含 1 2 3 总和将为 123 6 到目前为止 我已经得到了这段代码 但它返回未定义 function multiply array var sum 1 for var
  • 仅隐藏那些选择了空值的选择框

    我只想隐藏那些选择了空值的选择框 我有以下 HTML 和 jQuery div class form item div
  • 异或交换可以扩展到两个以上的变量吗?

    我一直在尝试将异或交换扩展到两个以上的变量 例如n变量 但我没有得到比这更好的地方3 n 1 对于两个整型变量x1 and x2你可以像这样交换它们 swap x1 x2 x1 x1 x2 x2 x1 x2 x1 x1 x2 所以 假设你有
  • 在 SQL Server 中通过标准差消除异常值

    我试图通过标准差消除 SQL Server 2008 中的异常值 我只想要特定列中包含该列平均值的 1 标准差范围内的值的记录 我怎样才能做到这一点 如果您假设事件呈钟形曲线分布 则只有 68 的值与平均值相差 1 个标准差以内 95 的值
  • Soundcloud HTML5 音量控制

    我的网站上有一个使用 soundcloud HTML5 播放器的曲目 我想知道是否有什么方法可以让它安静一点 这样在打开我的页面时就不会吓到观众 如果有人能引导我走向正确的方向 了解如何改变 soundcloud 上的播放器音量 我将不胜感
  • 动态生成的控件 ID 返回为 NULL

    我可以在 Page PreInit 函数中创建动态控件 如何检索控件及其 ID 我的 C 代码用于创建动态控件之一 var btn new WebForms Button btn Text btn ID Addmore btn Click
  • PHP 的 mb_internal_encoding 实际上是做什么的?

    根据 PHP 网站 http www php net manual en function mb internal encoding php它这样做 coding 是用于 HTTP 输入的字符编码名称 字符编码转换 HTTP输出字符编码 转
  • fprintf() 线程安全吗?

    我正在为野人就餐问题的某些变量编写一个 C 解决方案 现在 我创建线程 每个线程都将 FILE 获取到同一个调试文件 在线程内我正在使用 fprintf 进行一些打印 打印的语句不受任何类型的互斥锁等保护 我没有在调试文件中观察到任何交错行
  • 如何使用 PyMongo 在重复键错误后继续插入

    如果我需要在 MongoDB 中插入尚不存在的文档 db stock update one document set document upsert True 将完成这项工作 如果我错了 请随时纠正我 但是 如果我有一个文档列表并想将它们全