1

我希望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);

两者都导致更新所有文档。有没有办法将它推到猫鼬而不必使用map?我没有提到的另一件事是.update()没有 multi 导致 1 个文档被更新。

4

2 回答 2

1

_id您还可以提取要更新的 s 数组,然后使用$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");
    });
});
于 2015-03-31T21:26:56.550 回答
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);
  }
}
于 2015-03-31T21:17:23.990 回答