猫鼬更新有限制

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");
    });
});