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

Posted

技术标签:

【中文标题】Mongoose:如何从 find() 批量更新修改后的数据【英文标题】:Mongoose: How to bulk update modified data from find() 【发布时间】:2020-06-07 06:35:15 【问题描述】:

我有一个函数可以修改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();

一些想法:

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

从这里出发的有效方法是什么?

【问题讨论】:

【参考方案1】:

有一个similar 问题。 不是在“猫鼬”中,或者至少在写作时还没有。 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
        );

 );

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

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

【讨论】:

以上是关于Mongoose:如何从 find() 批量更新修改后的数据的主要内容,如果未能解决你的问题,请参考以下文章

更新 findOne()/find()/findById() 返回的文档 - mongoose

更新 findOne()/find()/findById() 返回的文档 - mongoose

尝试与 Mongoose 进行批量更新。最干净的方法是啥?

未找到结果时如何从 Mongoose Find 查询返回自定义消息而不是空数组

Mongoose (mongodb) 批量插入、删除、更新和无操作

Mongoose 中的批量更新