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

时间:2013-12-31 09:06:43

标签: node.js mongodb batch-file mongoose

我有包含列表的文档。让我们说它们是:

[
 {
  _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'
 },
 {
  ..
 } 
]

现在我想使用批量更新来更改其订单字段。我有一个jSON of updated_stage order

var updated_stage = [{_id: '52b37432b2395e1807000008', order:2},{_id: '52b37432b2395e180700000e', order:1}, {_id: '52b37432b2395e1807000009', order:3}]

现在我需要使用我拥有的新数组更新Mongoose中的LIST模型。我知道我可以使用批量更新

更新具有相同值的多个文档
Model.update({ }, { $set: { order: 10 }}, { multi: true }, callback);

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

这里我使用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();  
});

答案 2 :(得分:0)

你们可以使用mongoose/mongodb的批量写入功能

refference

enter image description here