- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个较大的 (~100) 个小型文档数组(每个文档可能有 10 个字段)要插入到 MongoDB 中。但是它们中的许多(也许全部,但通常是 80% 左右)已经存在于数据库中。这些文件代表 future 几个月即将发生的事件,我每两天更新一次数据库。所以大部分事件都已经在那里了。
任何人都知道(或想猜测)是否更有效:
db.collection.insert(myArray, {continueOnError: true}, 回调)
单独插入,首先检查 _ID 是否存在?
首先进行一次大删除(类似于 db.collection.delete({_id: $in : [array of all the IDs in my new documents] })
,然后进行批量删除插入?
我可能会做 #1,因为这是最简单的,而且我认为 100 个文档没有那么大,所以这可能无关紧要,但如果有 10,000 个文档呢?如果重要的话,我正在使用 node.js 驱动程序在 JavaScript 中执行此操作。我的背景是 Java,其中异常非常耗时,这就是我要问的主要原因 - “continueOnError”选项会耗时吗???
添加:我认为“upsert”没有意义。那是为了更新单个文档。在我的例子中,代表即将发生的事件的单个文档没有改变。 (好吧,也许是,那是另一个问题)
现在的情况是将添加一些新文档。
最佳答案
My background is in Java where exceptions are time consuming and that's the main reason I'm asking - will the "continueOnError" option be time consuming???
Bulk Inserts 的 ContinueOnError
标志只影响批处理的行为:不是在遇到第一个错误时停止处理,而是处理整个批处理。
在 MongoDB 2.4 中,批处理只会出现一个错误,这将是遇到的最后一个错误。这意味着如果您确实关心捕获错误,那么您最好进行单独的插入。
与单次插入相比,批量插入节省的主要时间是减少了网络往返。驱动程序可以将批量插入分解为多达 MaxMessageSizeBytes
的批处理,而不是向 MongoDB 服务器发送消息被 mongod
服务器接受(当前为 48Mb)。
鉴于您的用例只有 100 多个(甚至 1000 个)文档要插入,而其中 80% 已经存在,使用批量插入可能不会带来巨大好处(尤其是如果此过程仅每隔几天发生一次)。你的小插入会被批量合并,但 80% 的文档实际上并不需要发送到服务器。
我仍然倾向于使用 ContinueOnError
进行批量插入,而不是您的删除和重新插入方法,但是考虑到您正在争论的文档数量和实际插入的百分比,批量插入可能是不必要的早期优化需要插入。
我建议使用不同的方法运行几次,以查看对您的用例的实际影响。
请注意,批处理功能在 MongoDB 2.5 开发系列中得到了显着改进(最终将在 2.6 生产版本中达到顶峰)。计划的功能包括支持批量更新插入和累积每个文档的错误,而不是每批处理的单个错误。
新的写入命令需要驱动程序更改才能支持,但可能会改变上面的一些假设。例如,通过 ContinueOnError
使用新的批处理 API,您最终可能会得到一个结果,其中 80% 的批处理 ID 是重复键。
更多详细信息,请参见父问题SERVER-9038在 MongoDB 问题跟踪器中。
关于node.js - MongoDB 批量插入已经存在许多文档的地方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21316898/
我用运行 Node node --debug app OR node --debug-brk app 它有反应 debugger listening on port 5858 Express serv
这个问题在这里已经有了答案: What is the difference between (int *i) and (int* i) in context of both C and C++? [
我有一个应用程序,它通过消息队列将数据库写入命令分派(dispatch)给工作人员(数量非常大),因此无法保证它们的接收顺序。 我有两个 Node ,例如“Account”和“Media”。在此假设的
有没有办法在调用 ts-node 时将选项传递给 Node ?我正在尝试在 Node 中使用一个实验性功能,如果它能与 ts-node 一起使用,那就太好了。 这就是我目前正在做的事情: ts-nod
我有一个容器化的Node应用程序,它在DigitalOcean服务器上运行。当我更新服务器上的应用程序时,该应用程序必须关闭一小段时间。为了能够更新应用程序并避免停机,我目前正在阅读零停机时间部署/蓝
我正在编写一个 Node.js 应用程序。我正在使用 request 和 Cheerio 加载一组 URL 并获取该网站的大量信息,现在假设我想要获取的只是标题: var urls = {"url_1
如果不弹出以下错误,我无法安装任何 Node.js 模块。错误代码引用package.json文件。如果知道为什么会发生这种情况,我们将不胜感激。 最佳答案 这些不是错误,它们只是警告。一切都应该如此
如果我运行(从我的项目目录中): supervisor javascripts/index.js 我得到:/usr/bin/env: Node :没有这样的文件或目录 如果我运行: node java
我已遵循使用 Node-Inspector 的所有步骤 但是当我打开应用程序时,我在控制台上看不到任何脚本或日志。 我的应用程序在端口 4000 上运行。我认为唯一可能发生冲突的是端口 8080 上的
我在android中使用rxjava2,有时会遇到这样的问题: Observable.fromArray( // maybe a list about photo url in SD
我目前正在使用 Node 光纤来编写同步服务器端代码。我主要通过 try-catch block 进行错误处理,但外部库或其他小部分异步代码中总是有可能发生错误。我正在考虑使用新的域功能来尝试将这些错
看起来node-debug是node-inspector周围的一个shell?分别什么时候应该使用? 最佳答案 如果您安装node-debug,您只能访问node-debug命令。 如果您安装node
我目前正在代理后面工作,该代理不允许我执行此命令的 HTTP GET 请求阶段: Node node-sass/scripts/build.js 请求阶段: gyp http GET https://
听说node js可以用在服务端。我以前用过jsp。 jsp页面内部的java代码对客户端是不可见的。如果 Node js 只是 javascript,那么它如何对客户端不可见? 最佳答案 首先,No
我正在为 Node native 插件从 node-waf 构建迁移到 node-gyp 构建系统。 node-gyp 说它支持多个目标版本,但我在使用 node-gyp 时找不到如何指定目标 Nod
给定一个 $node ,我正在尝试在以下两种输出该 $node 的方式之间做出决定。 要么 $output = theme('node', $node); 或 node_build_content($
如果package.json中的窗口A打开一个新窗口B,node-main如何访问它?这是我的代码: package.json { "main": "index.html",
我试图在我的 xml 中的特定节点 ( ) 之前插入一个注释节点。这是它的方法: function test(xmlResponse) { var parser = new DOMParse
我正在尝试做npm install wrtc使用 Node 版本 16.14.0 但这还没有完成。它在给npm error code 1所以我试图将 Node 版本更改为以前的 lts 14.19.0
当我在 Visual Studio 中运行 Node.js 应用程序时,我收到以下消息:DeprecationWarning: 'node --debug' 和 'node --debug-brk'
我是一名优秀的程序员,十分优秀!