Mongoose更新限制

时间:2015-03-31 18:03:29

标签: node.js mongodb mongoose angular-fullstack

我希望一次更新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个文档被更新。

2 个答案:

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