使用Mongoose更新Node.js中由find()方法返回的结果
我是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;
我打破这个问题如下:
- 检索20个self_ , mod_sent是-1。
- 将那20个selfies的mod_count更新为0。
使用find()
, limit()
和exec()
方法检索20个自拍。 一旦我有这些自拍,我可以使用forEach()
和update()
迭代和更新每个sent_mod为0.但是这种方法执行更新操作20次。 我认为可能有更好的方法来做到这一点。 我从MongoDB文档中了解到findAndUpdate()
,发现Mongoose有各种方法,比如findOne()
, findOneAndUpdate()
。 但是我无法find一个更好的方法来解决我的问题也使用这些方法。
# 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;
编辑:
解决scheme (由gtsoukbuild议):
# 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。 创build一个数组,把你想要更新的每个logging的_id,然后使用更新
Selfies.update({_id: {$in: array_with_ids}}, {$set:{mod_count:0}}, {multi: true});