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

Updating the result returned by find() method alone in Node.js using 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。

要检索 20 张自拍,我使用 find()limit() 然后 exec() 方法。一旦我有了这些自拍,我就可以使用 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;

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

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