繁体   English   中英

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

[英]Mongoose: How to bulk update modified data from find()

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

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

例如,

const items = await Item.find();

// Some modifications done in items array
for (let i = 50; i < 100; i++) {
  items[i].count = i
}

在这里,如何保存修改后的文档数组?

什么不起作用

  await items.save();

一些想法:

  1. 使用Item.collection.initializeOrderedBulkOp();
  2. 使用Item.updateMany()
  3. 使用以下内容更新每个修改过的文档:
items.forEach(item => Item.update({_id: item._id}, {$set: {count: count}})

从这里开始的有效方式是什么?

有一个类似的问题。 具体不是“猫鼬”,或者至少在写作时还没有。 从 2.6 版开始,MongoDB shell 实际上在“幕后”中使用了“批量操作 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
        });

 });

主要的问题是“猫鼬方法”实际上意识到可能实际上还没有建立连接并在完成之前“排队”。 您正在“深入研究”的本机驱动程序并没有做出这种区分。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM