我可以从命令行运行以下更新命令:
db.Camera.update({_id:ObjectId("51059ca49c7b280809a2a81e")}, {$set: {"Selected":0}});
但是NodeJS中的以下代码不起作用。当我记录item.Selected时,我得到一个非零值。
exports.findById = function(req, res) {
var ids = req.params.id.split(",");
db.collection('Camera', function(err, collection) {
for(var i = 0; i < ids.length; i++){
collection.findOne({'_id':idArray[i]}, function(err, item) {
item.Selected += 1;
console.log('Selected: ' + item.Selected);
collection.update({'_id':new BSON.ObjectID(ids[i])}, item,function(err, updated) {
if( err || !updated ) console.log("Not updated");
else console.log("Updated");
});
});
}
});
};
在控制台中,我总是看到“未更新”。
感谢您的帮助。
答案 0 :(得分:1)
由于您使用变量i
,循环中的id不是您所期望的。这些是回调,在一个闭包内。因此,当findOne
返回时,循环已经完成,这意味着对于每个“相机”而言,i
将等于ids.length
并不是您所期望的。
您可以直接在代码调用更新时使用项目的_id
属性(或者您想要的任何其他内容,只是不依赖于循环索引,除非您将代码包装在循环中关闭可能没有必要)。
像这样...... update
调用的查询参数发生了变化:
{'_id':item._id)}
完整代码:
exports.findById = function(req, res) {
var ids = req.params.id.split(",");
db.collection('Camera', function(err, collection) {
for(var i = 0; i < ids.length; i++){
collection.findOne({'_id':ids[i]}, function(err, item) {
item.Selected += 1;
console.log('Selected: ' + item.Selected);
collection.update({'_id':item._id)}, item,function(err, updated) {
if( err || !updated ) console.log("Not updated");
else console.log("Updated");
});
});
}
});
};
答案 1 :(得分:1)
问题我有物品ID,如果你试着记录消息你会得到一个错误说一些关于ID blah bla :)的独特性所以我做的是我保存现有物品的ID,然后删除它在更新被调用之前。 mongodb开发者也提出了同样的建议。所以你的代码看起来像:
id = item._id
delete item._id
collection.update(_id: id, item, function(err, updated){...}
希望这会有所帮助。我也建议使用Mongoose。