在Mongoose中更新具有不同值的多个元素

Dev*_*mar 11 batch-file mongoose mongodb node.js

我有包含列表的文档.让我们说他们是:

[
 {
  _id: 52b37432b2395e1807000008,
  name: ListA,
  order: 1,
  desc: 'More about List A'
 },
 {
  _id: 52b37432b2395e1807000009,
  name: LISTB,
  order: 2,
  desc: 'More about List B'
 },
 {
  _id: 52b37432b2395e180700000e,
  name: LISTC,
  order: 3,
  desc: 'More about List C'
 },
 {
  ..
 } 
]
Run Code Online (Sandbox Code Playgroud)

现在我想使用批量更新来更改其订单字段.我有一个update_stage命令的JSON

var updated_stage = [{_id: '52b37432b2395e1807000008', order:2},{_id: '52b37432b2395e180700000e', order:1}, {_id: '52b37432b2395e1807000009', order:3}]
Run Code Online (Sandbox Code Playgroud)

现在我需要使用我拥有的新数组更新Mongoose中的LIST模型.我知道我可以使用批量更新更新具有相同值的多个文档

Model.update({ }, { $set: { order: 10 }}, { multi: true }, callback);
Run Code Online (Sandbox Code Playgroud)

但我必须用不同的值来更新它们.我该怎么办?什么是最有效的方式?

Jay*_*ram 5

我能想到的最有效的方法是forEach在你的updated_satge数组上运行一个循环。现在在 mongodb 中的现有文档中获取 _id 和更新顺序。

  • 但他正在使用猫鼬:) @Sammaye (3认同)
  • 我总是使用 collection.forEach 然后使用 document.save(callback),每次保存都有自己的回调,所以最难的部分是知道所有文档何时保存! (2认同)
  • 这很容易检测。获取数组的长度,并在每次保存时减少 count 的值。当它等于 0 时表示所有已更新。@damphat (2认同)

dam*_*hat 5

这是我使用 collection.forEach 进行的测试,然后调用 doc.save:

我使用sync.each来知道所有文档何时保存

var mongoose = require('mongoose'), async = require('async');

mongoose.connect('localhost', 'learn-mongoose');

var User = mongoose.model('User', {name: String});

async.series([
    function (done) {
        // remove User collection if exist
        User.remove(done);
    },

    function(done) {
        // re-create a collection with 2 users 'Mr One', 'Mr Two'
        User.create([{name: 'Mr One'}, {name: 'Mr Two'}], done);
    },

    function(done) {
        // upperCase user.name
        User.find(function(err, users) {
            async.each(users, function(user, callback) {
                user.name = user.name.toUpperCase();
                user.save(callback);
            }, done); // done is call when all users are save!!!!
        });
    },
    function(done) {
        // print result
        User.find(function(err, users) {
            console.log(users);
            done();
        });
    },
], function allTaskCompleted() {
    console.log('done');
    mongoose.disconnect();  
});
Run Code Online (Sandbox Code Playgroud)