Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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 Mongoose:如何从find()批量更新修改的数据_Node.js_Database_Mongodb_Mongoose - Fatal编程技术网

Node.js Mongoose:如何从find()批量更新修改的数据

Node.js Mongoose:如何从find()批量更新修改的数据,node.js,database,mongodb,mongoose,Node.js,Database,Mongodb,Mongoose,我有一个函数可以修改find()中的大多数文档 我想知道如何将修改后的文档数组保存回数据库 比如说, const items=wait Item.find(); //在items数组中进行了一些修改 for(设i=50;iitem.update({u-id:item.\u-id},{$set:{count:count}) 从这里开始,什么是有效的方法?有一个问题。 不是特别在“mongoose”中,或者至少在编写之前还没有。2.6版本的MongoDB外壳实际上使用了“大容量操作API”,就像它

我有一个函数可以修改find()中的大多数文档

我想知道如何将修改后的文档数组保存回数据库

比如说,

const items=wait Item.find();
//在items数组中进行了一些修改
for(设i=50;i<100;i++){
项目[i]。计数=i
}
在这里,如何保存修改后的文档数组?

什么不起作用

wait items.save();
一些想法:

  • 使用Item.collection.initializeOrderedBulkOp()
  • 使用Item.updateMany()
  • 使用以下内容更新每个修改过的文档:
  • items.forEach(item=>item.update({u-id:item.\u-id},{$set:{count:count})
    
    从这里开始,什么是有效的方法?

    有一个问题。 不是特别在“mongoose”中,或者至少在编写之前还没有。2.6版本的MongoDB外壳实际上使用了“大容量操作API”,就像它用于所有通用帮助程序方法一样。在它的实现中,它会首先尝试这样做,如果检测到旧版本的服务器,则会出现“回退”到遗留实现

    所有mongoose方法“当前”都使用“遗留”实现或写关注点响应以及基本遗留方法。但是,任何给定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
            });
    
     });
    
    var mongoose=require('mongoose'),
    Schema=mongoose.Schema;
    猫鼬mongodb://localhost/test');
    var sampleSchema=新模式({},{“strict”:false});
    var样本=mongoose.model(“样本”,sampleSchema,“样本”);
    mongoose.connection.on(“打开”,函数(err,conn){
    var bulk=Sample.collection.initializeOrderedBulkOp();
    var计数器=0;
    //表示长循环
    对于(变量x=0;x<100000;x++){
    bulk.find(/*some search*/).upsert().updateOne(
    /*更新条件*/
    });
    计数器++;
    如果(计数器%1000==0)
    bulk.execute(函数(err,result){
    bulk=Sample.collection.initializeOrderedBulkOp();
    });
    }
    如果(计数器%1000!=0)
    bulk.execute(函数(错误、结果){
    //也许做点有结果的事
    });
    });
    
    这里的主要问题是“mongoose方法”实际上意识到可能还没有建立连接,并在连接完成之前“排队”。您正在“挖掘”的本机驱动程序没有这种区别

    因此,您必须意识到连接是以某种方式或形式建立的,但是您可以使用本机驱动程序方法,只要您小心操作