使用Mongoose仅在Node.js中更新find()方法返回的结果

时间:2015-02-26 14:30:09

标签: javascript node.js mongodb express mongoose

我是Node.js的新手。我的Node.js应用程序有一个名为Selfie的模型。

# model/selfie.js
var mongoose = require('mongoose'),
    Schema = mongoose.Schema,
    selfieSchema = new Schema({
        path: { type: String },
        caption: { type: String },
        sent_mod: { type: Number, default: -1 }, // -1 not sent, 0 sent, 1 accepted
        display_count: { type: Number, default: -1 }, // -1 not sent, 0 sent, 1 displayed
        time_stamp: { type: Date, default: new Date() }
    }),
    Selfie = mongoose.model('selfie', selfieSchema);

module.exports = Selfie;

按如下方式解决问题:

  1. 检索其 mod_sent 为-1的20个自拍。
  2. 将这20个自拍的 mod_count 更新为0。
  3. 使用find()limit()exec()方法检索20个自拍。一旦我有了这些自拍,我就可以使用forEach()update()来迭代并将每个 sent_mod 更新为0.但是这种方法会执行20次更新操作。我认为可能有更好的方法来做到这一点。我从MongoDB文档中了解了findAndUpdate(),发现Mongoose有各种方法,如findOne()findOneAndUpdate()。但我也找不到使用这些方法解决问题的更好方法。

    # routes/selfie.js
    var express = require('express'),
        router = express.Router(),
    
        Selfie = require('../models/selfie'),
    
        mongoose = require('mongoose');
    
    router.get('/moderate', function(req, res) {
    
            Selfie.find({ sent_mod: -1 }).limit(20).exec(function(err, selfies) {
                if(err) {
                    console.log(err);
                    return;
                }
                console.log(selfies);
    
            });
    });
    
    
    module.exports = router;
    


    修改
    解决方案(由gtsouk建议):

    # routes/selfie.py
    var express = require('express'),
        router = express.Router(),
    
        Selfie = require('../models/selfie'),
    
        mongoose = require('mongoose');
    
    router.get('/moderate', function(req, res) {
    
            Selfie.find({ sent_mod: -1 }).limit(2).exec(function(err, selfies) {
                if(err) {
                    console.log(err);
                    return;
                }
                console.log(selfies);
                var selfieIds = selfies.map(function(selfie) {
                    return selfie._id;
                });
                console.log(selfieIds);
                Selfie.update({ _id: {  $in: selfieIds } }, { $set: { sent_mod: 0 } }, { multi: true }, function(err, num) {
                    if(err) {
                        console.log(err);
                        return;
                    }
                    console.log(num);
                });
            });
    });
    
    
    module.exports = router;
    

1 个答案:

答案 0 :(得分:1)

模型update()方法可以更新多个文档,但没有限制参数(据我所知)。您可以尝试仅更新从find()操作中获得的ID。创建一个数组,放入要更新的每个记录的_id,然后使用

进行更新
Selfies.update({_id: {$in: array_with_ids}}, {$set:{mod_count:0}}, {multi: true});