猫鼬更新有限制
Mongoose update with limit
我希望一次性更新 X documents
。简而言之,我基本上需要随机 select N documents
然后将它们更新为 "selected"
。我正在尝试设计一个需要随机分配问题的 API。我在我试过的猫鼬中找不到这样做的方法:
update
结束了 select 一切
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);
两者都更新了所有文档。有没有办法将它推到猫鼬而不必使用 map
?我没有提到的另一件事是 .update()
没有 multi 导致 1 个文档被更新。
所以我做了一个简单的 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);
}
}
您还可以拉取您想要更新的 _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");
});
});
我希望一次性更新 X documents
。简而言之,我基本上需要随机 select N documents
然后将它们更新为 "selected"
。我正在尝试设计一个需要随机分配问题的 API。我在我试过的猫鼬中找不到这样做的方法:
update
结束了 select 一切
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);
两者都更新了所有文档。有没有办法将它推到猫鼬而不必使用 map
?我没有提到的另一件事是 .update()
没有 multi 导致 1 个文档被更新。
所以我做了一个简单的 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);
}
}
您还可以拉取您想要更新的 _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");
});
});