使用 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;
我将问题分解如下:
- 检索mod_sent为-1的20张自拍。
- 将这 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});
我是 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;
我将问题分解如下:
- 检索mod_sent为-1的20张自拍。
- 将这 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});