Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js MongoDB批量插入已存在多个文档的位置_Node.js_Mongodb_Bulkinsert - Fatal编程技术网

Node.js MongoDB批量插入已存在多个文档的位置

Node.js MongoDB批量插入已存在多个文档的位置,node.js,mongodb,bulkinsert,Node.js,Mongodb,Bulkinsert,我有一个较大的(~100)小文档数组(每个文档可能有10个字段)要插入MongoDB中。但其中许多(可能全部,但通常为80%左右)已经存在于数据库中。这些文档代表了未来几个月即将发生的事件,我每隔几天就会更新一次数据库。所以大部分的活动都已经在那里了 任何人都知道(或想猜测)如果: 执行批量更新,但continueOnError=true,例如 db.collection.insert(myArray,{continueOnError:true},回调) 是否单独插入,首先检查_ID是否存在 首

我有一个较大的(~100)小文档数组(每个文档可能有10个字段)要插入MongoDB中。但其中许多(可能全部,但通常为80%左右)已经存在于数据库中。这些文档代表了未来几个月即将发生的事件,我每隔几天就会更新一次数据库。所以大部分的活动都已经在那里了

任何人都知道(或想猜测)如果:

  • 执行批量更新,但continueOnError=true,例如
  • db.collection.insert(myArray,{continueOnError:true},回调)

  • 是否单独插入,首先检查_ID是否存在

  • 首先做一个大的删除(比如
    db.collection.delete({u id:$in:[我的新文档中所有id的数组]})
    ,然后进行大容量插入

  • 我可能会做#1,因为这是最简单的,我不认为100个文档都那么大,所以这可能无关紧要,但如果有10000个文档,我会用JavaScript和node.js驱动程序来做这件事。我的背景是Java,异常非常耗时,这是我问的主要原因-“continueOnError”选项是否耗时

    补充:我认为“upsert”没有意义。这是为了更新单个文档。在我的情况下,表示即将到来的事件的单个文档没有改变。(好吧,也许是,这是另一个问题)


    将添加一些新文档。

    我保证使用upsert让mongo处理更新或插入逻辑,您也可以使用multi更新符合条件的多个文档:

    从文件中:

    向上插入 可选参数(如果设置为true),则在没有与查询条件匹配的文档时创建新文档。默认值为false,未找到匹配项时不会插入新文档。此参数的语法取决于MongoDB版本

    multi 可选参数,如果设置为true,则更新满足查询条件的多个文档。如果设置为false,则更新一个文档。默认值为false。有关其他信息

    db.collection.update(
    ,
    ,
    {upsert:,multi:}
    )
    
    以下是参考文件:
    对于你的情况,我建议你考虑取一份现有的文件“代码>代码ID >代码> s,然后只发送不在该列表中的文档。当你可以使用<代码>更新>代码>单独更新时,没有什么理由这样做。除非列表中的代码>如果不支持,那么抓取列表并进行比较将比单独更新每个文档的数据库更有效(有很大一部分文档显然无法更新)

    我不会使用
    continueOnError
    发送所有文档……这样效率较低

    我的背景是Java,在Java中异常非常耗时,这就是我要问的主要原因——“continueOnError”选项会耗时吗

    ContinueOnError
    标志仅影响批处理的行为:不会在遇到第一个错误时停止处理,而是处理整个批

    在MongoDB 2.4中,批处理只会出现一个错误,这将是遇到的最后一个错误。这意味着如果您确实关心捕获错误,那么最好执行单独的插入

    批量插入与单次插入相比,主要节省的时间是减少网络往返。驱动程序可以将批量插入分解为多个批次,最多为
    mongod
    服务器所接受(当前为48Mb),而不是为每个插入的文档向MongoDB服务器发送消息

    批量插入是否适合此用例? 如果您的用例中只有100个(甚至1000个)文档需要插入,而80%的文档已经存在,那么使用批量插入可能不会有太大的好处(特别是如果此过程仅每隔几天发生一次)。您的小插入将成批组合,但80%的文档实际上不需要发送到服务器

    我仍然倾向于使用
    ContinueOnError
    批量插入,而不是使用删除和重新插入的方法,但是考虑到您正在争论的文档数量和实际需要插入的百分比,批量插入可能是不必要的早期优化

    我建议用不同的方法运行几次,看看对您的用例有什么实际影响

    MongoDB 2.6 首先,MongoDB 2.5开发系列(将在2.6生产版本中达到高潮)的批处理功能正在显著改进。计划中的功能包括支持批量升级和累积每个文档的错误,而不是每个批的单个错误

    新的写入命令需要更改驱动程序才能支持,但可能会更改上面的一些假设。例如,使用新的批处理API,使用
    ContinueOnError
    ,您最终可能会得到80%的批处理ID是重复密钥的结果


    有关更多详细信息,请参阅MongoDB问题跟踪器中的父问题。

    您是否能够检查文档/对象是否已分配了id,而无需调用服务器?请尝试在应用程序中尽可能多地执行此操作,而无需调用数据库。为什么不使用“upsert”命令“如果文档存在,则将更新,如果不存在,则将插入(如果您没有要更新的内容,则不会更改文档)我相信upsert一次只能处理一个文档。另外,在我的情况下,我不是更新现有文档,而是添加新文档。这听起来很有趣——我将尝试一下。目前,我决定删除并重新插入所有文档,以便所有文档都达到d
    collection.insert(item, {continueOnError: true, safe: true}, function(err, result) {
                        if (err && err.code != "11000"){
                            throw err;
                         }
    
                        db.close();
                        callBack();
    });
    
    collection.insert(item, {continueOnError: true, safe: true}, function(err, result) {
                        if (err && err.code != "11000"){
                            throw err;
                         }
    
                        db.close();
                        callBack();
    });