0

我可以从命令行运行以下更新命令:

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

};

在控制台中,我总是看到“未更新”。

谢谢你的帮助。

4

2 回答 2

1

我遇到的问题是项目 ID,如果您尝试记录该消息,您会收到一条错误消息,说明有关 ID 的唯一性 blah bla :) 所以我所做的是我保存了现有项目的 ID,然后在更新之前将其删除被调用。mongodb 开发人员也提出了同样的建议。所以你的代码看起来像:

id = item._id
delete item._id
collection.update(_id: id, item, function(err, updated){...}

希望这会有所帮助。我也建议使用猫鼬。

于 2013-02-03T19:10:39.100 回答
1

由于您使用了变量,循环内的 id 不是您所期望的i。这些是回调,在闭包内。因此,当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");
                });
            });
        }
    });

};

于 2013-02-02T23:00:50.170 回答