node.js – 使用mongoose在MongoDB中批量提升

是否有任何选项可以使用猫鼬执行批量提花?所以基本上有一个数组,并插入每个元素,如果它不存在或更新它,如果它存在? (我正在使用海关_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年了。所以我想知道是否有任何选择使用猫鼬做这个?

谢谢!

解决方法

不是在特定的“猫头鹰”,或至少尚未写作。 2.6版本中的MongoDB shell实际上使用了所有的一般帮助方法中的 “Bulk operations API”“引擎盖”。在实现中,它首先尝试这样做,如果检测到较旧版本的服务器,那么对旧版本的实现会有一个“后备”。

所有的“目前”的黑客方法都使用“遗留”实现或写入关注响应和基本的传统方法。但是,来自任何给定的mongoose模型的.collection访问器基本上可以从本身实现自己实现mongoose的底层“节点本机驱动程序”访问“收集对象”

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方法”实际上意识到,连接可能实际上不会被创建,并且“排队”直到完成。您正在“挖掘”的本地驱动程序不会使这个区别。

所以你真的必须意识到连接是以某种方式或形式建立的。但是,只要你注意到你在做什么,你可以使用本机驱动程序。

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...