2015-03-31 87 views
0

我期待一次更新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()没有多导致1文件正在更新。

回答

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

你也可以拉的_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"); 
    }); 
});