【问题标题】:nodejs mongoose bulk updatenodejs mongoose 批量更新
【发布时间】:2015-03-28 21:35:54
【问题描述】:

我有一个文档集合,我需要为所有文档添加一个新字段。如果我运行查询以获取所有文档,然后更新每一个 node.js 停止,可能是因为内存泄漏

这是我的代码

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)
});

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

【问题讨论】:

  • 你应该看看使用流 - 然后你可以暂停,进行更改,保存,然后恢复流 - 编辑:mongo 只允许原子更改(即一次更改一个文档 - 所以没有没有批量更改)
  • 在我看来,node.js 在更新文档时不应该“停止”。关于使用 mongoose 进行批量更新,MongoDB 不支持多文档事务。如果您想实现一些接近的东西,请查看stackoverflow.com/questions/12493576/…

标签: node.js mongodb mongoose


【解决方案1】:

这个例子应该包括我们可以直接与 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);
});

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

【讨论】:

    【解决方案2】:

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

    看起来像这样:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      查询是搜索id

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-15
        • 2012-08-23
        • 2015-10-20
        • 2020-07-09
        • 2014-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多