微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐