nodejs猫鼬批量更新

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/28218460/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-02 18:21:45  来源:igfitidea点击:

nodejs mongoose bulk update

node.jsmongodbmongoose

提问by Claudio Pomo

I've a collection of data and I need to add for every documents a new field. If I run a query to get all documents and the update every single one node.js is stopped, may be for memory leak

我有一组数据,我需要为每个文档添加一个新字段。如果我运行查询以获取所有文档并且每个 node.js 都停止更新,则可能是内存泄漏

This is my code

这是我的代码

var express = require('express');

var geocoderProvider = 'google';
var httpAdapter = 'http';

var People = require("./models/people").collection.initializeOrderedBulkOp();

var app = express();

var geocoder = require('node-geocoder').getGeocoder(geocoderProvider, httpAdapter, {});

app.get('/', function (req, res) {
  People.find({}, function (err, docs) {
    if (err) {
      res.send(err);
    }else{
      docs.forEach( function (doc){
        geocoder.geocode({address: doc.address, country: 'Italy', zipcode: doc.cap}, function(error, value) {
          doc.loc.coordinates[0]=value[0].latitude;
          doc.loc.coordinates[1]=value[0].longitude;
          People.update({ _id: doc._id }, { $set: { loc: doc.loc }}, { multi: true }, function (error){
            if(error){
              console.error('ERROR!');
            }
          });
        });
      });
    }
  });
});

var server = app.listen(3000, function () {
  var host = server.address().address
  var port = server.address().port
  console.log('Example app listening at http://%s:%s', host, port)
});

There is any way to bulk update with mongoose? Thanks in advance

有没有办法用猫鼬批量更新?提前致谢

回答by Mangesh Pimpalkar

More detailed info about the query and update query.

有关查询和更新查询的更多详细信息。

var bulk = People.collection.initializeOrderedBulkOp();
    bulk.find(query).update(update);
    bulk.execute(function (error) {
       callback();                   
    });

Query is searching with array.
Update needs a $set

查询正在使用数组进行搜索。
更新需要一个 $set

var bulk = People.collection.initializeOrderedBulkOp();
    bulk.find({'_id': {$in: []}}).update({$set: {status: 'active'}});
    bulk.execute(function (error) {
         callback();                   
    });

Query is a searching the id

查询是搜索id

var bulk = People.collection.initializeOrderedBulkOp();
    bulk.find({'_id': id}).update({$set: {status: 'inactive'}});
    bulk.execute(function (error) {
         callback();                   
    });

回答by jtmarmon

You can drop down to the collection level and do a bulk update. This action will not be atomic - some of the writes can fail and others might succeed - but it will allow you to make these writes in a single round trip to your database.

您可以下拉到集合级别并进行批量更新。此操作不会是原子操作 - 一些写入可能会失败,而另一些可能会成功 - 但它允许您在对数据库的单次往返中进行这些写入。

It looks like this:

它看起来像这样:

var bulk = People.collection.initializeUnorderedBulkOp();
bulk.find({<query>}).update({<update>});
bulk.find({<query2>}).update({<update2>});
...
bulk.execute(function(err) {
    ...
});

Check out the docs here: http://docs.mongodb.org/manual/core/bulk-write-operations/

在此处查看文档:http: //docs.mongodb.org/manual/core/bulk-write-operations/

回答by Hem? Vidal

This example should include all the cases that we can mix together using directly with Mongoose bulkWrite()function:

这个例子应该包括我们可以直接与 Mongoose bulkWrite()函数混合使用的所有情况:

Character.bulkWrite([
  {
    insertOne: {
      document: {
        name: 'Eddard Stark',
        title: 'Warden of the North'
      }
    }
  },
  {
    updateOne: {
      filter: { name: 'Eddard Stark' },
      // If you were using the MongoDB driver directly, you'd need to do
      // `update: { $set: { title: ... } }` but mongoose adds $set for
      // you.
      update: { title: 'Hand of the King' }
    }
  },
  {
    deleteOne: {
      {
        filter: { name: 'Eddard Stark' }
      }
    }
  }
]).then(res => {
 // Prints "1 1 1"
 console.log(res.insertedCount, res.modifiedCount, res.deletedCount);
});

Official Documentation: https://mongoosejs.com/docs/api.html#model_Model.bulkWrite

官方文档:https: //mongoosejs.com/docs/api.html#model_Model.bulkWrite