我希望一次更新X documents
。简而言之,我基本上需要随机选择N documents
,然后将其更新为"selected"
。我正在尝试设计一个需要随机分发问题的API。我找不到办法在我试过的猫鼬中做到这一点:
update
最终会选择所有内容
Question
.update({}, {
$inc: {
answerCount: 1,
lockedCount: 1
},
$push:{
devices: deviceID
}
}, {multi:true})
.limit(4)
---我也试过
Question
.find()
.sort({
answerCount: 1,
lockedCount: 1
})
.limit(req.query.limit || 4)
.update({}, {
$inc: {
answerCount: 1,
lockedCount: 1
},
$push:{
devices: deviceID
}
}, { multi: true }, callback);
两者都导致更新所有文档。有没有办法把它推到mongoose而不必使用map
?我没有提到的另一件事是.update()
没有multi导致1个文档被更新。
答案 0 :(得分:0)
所以我做了一个简单的map
实现,除非有人能找到更有效的方法,否则我会使用它。
Question
.find({
devices: { $ne: deviceID}
},
{ name: true, _id: true})
.sort({
answerCount: 1,
lockedCount: 1
})
.limit(req.query.limit || 4)
.exec(updateAllFound );
function updateAllFound(err, questions) {
if (err) {
return handleError(res, err);
}
var ids = questions.map(function(item){
return item._id;
});
return Question.update({ _id: { $in: ids} } ,
{
$inc: {
answerCount: 1,
lockedCount: 1
},
$push:{
devices: deviceID
}
}, { multi: true }, getByDeviceID);
function getByDeviceID(){
return res.json(200, questions);
}
}
答案 1 :(得分:0)
您还可以提取您想要更新的_id
数组,然后使用$in
运行更新查询。这将需要两次调用mongo,但更新仍然是原子的:
Question.find().select("_id").limit(4).exec(function(err, questions) {
var q = Question.update({_id: {$in: questions}}, {
$inc: {answerCount: 1, lockedCount:1},
$push: {devices: deviceid}
}, {multi:true});
q.exec(function(err) {
console.log("Done");
});
});