javascript - 使用 mongoose 在 MongoDB 中批量更新插入

标签 javascript node.js mongodb mongoose mongodb-query

是否有任何选项可以使用 mongoose 执行批量 upserts?所以基本上有一个数组,如果它不存在则插入每个元素,或者如果它存在则更新它? (我正在使用海关_ids)

当我使用 .insert 时,MongoDB 会为重复键返回错误 E11000(应该更新)。插入多个新文档可以正常工作:

var Users = self.db.collection('Users');

Users.insert(data, function(err){
            if (err) {
                callback(err);
            }
            else {
                callback(null);
            }
        });

使用.save会返回参数必须是单个文档的错误:

Users.save(data, function(err){
   ...
}

This answer建议没有这样的选项,但是它特定于 C# 并且已经 3 岁了。所以我想知道是否有任何选择可以使用 Mongoose 来做到这一点?

谢谢!

最佳答案

没有具体在“ Mongoose ”中,或者至少在撰写本文时还没有。 2.6 版本的 MongoDB shell 实际上使用 "Bulk operations API" “在引擎盖下”,因为它适用于所有通用辅助方法。在它的实现中,它首先尝试执行此操作,如果检测到旧版本的服务器,则会“回退”到旧的实现。

“当前”的所有 mongoose 方法都使用“旧版”实现或写入关注响应和基本的旧版方法。但是任何给定的 mongoose 模型都有一个 .collection 访问器,它本质上是从实现 mongoose 的底层“Node native 驱动程序”访问“集合对象”:

 var mongoose = require('mongoose'),
     Schema = mongoose.Schema;

 mongoose.connect('mongodb://localhost/test');

 var sampleSchema  = new Schema({},{ "strict": false });

 var Sample = mongoose.model( "Sample", sampleSchema, "sample" );

 mongoose.connection.on("open", function(err,conn) { 

    var bulk = Sample.collection.initializeOrderedBulkOp();
    var counter = 0;

    // representing a long loop
    for ( var x = 0; x < 100000; x++ ) {

        bulk.find(/* some search */).upsert().updateOne(
            /* update conditions */
        });
        counter++;

        if ( counter % 1000 == 0 )
            bulk.execute(function(err,result) {             
                bulk = Sample.collection.initializeOrderedBulkOp();
            });
    }

    if ( counter % 1000 != 0 )
        bulk.execute(function(err,result) {
           // maybe do something with result
        });

 });

主要的问题是“ Mongoose 方法”实际上知道连接可能尚未真正建立,并且“排队”直到完成。您正在“挖掘”的 native 驱动程序没有这种区别。

因此,您确实必须意识到连接是以某种方式或形式建立的。但是你可以使用 native 驱动方法,只要你小心你在做什么。

关于javascript - 使用 mongoose 在 MongoDB 中批量更新插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25285232/

相关文章:

php - 通过代码截取网页

javascript - 有没有更有效的方法来过滤这个对象数组?

javascript - 为什么我的 azure 函数未在 Application Insights 中记录错误?

node.js - Mongoose setDefaultsOnInsert 和 2dsphere 索引不起作用

python - MongoDB,批量查找返回什么

mongodb - 如何使用 Mongoose 和 MongoDB 2.6 插入到子文档中数组中的特定位置

javascript - 为什么我的 onclick 不会删除我的任何类(class)?

javascript - 调节模糊值的输入范围

node.js - 从node.js中的SQLite3查询返回数据的函数

node.js - NodeJS : for loop and promises