2013-02-02 26 views
0

更新有關MongoDB從犯規的NodeJS我能夠從命令行中運行以下命令更新工作

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

}; 

在控制檯中,我總是看到「未更新」。

感謝您的幫助。

回答

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

};

+0

對不起,這也沒有工作。 –

+0

我沒有注意到變量名稱idArray與由split(ids)創建的數組變量不匹配。試着改變它。 – WiredPrairie

+0

如果您在findOne調用上添加錯誤檢查,我想您會看到沒有任何匹配。 – WiredPrairie

1

我遇到的問題是產品ID,如果您嘗試記錄該消息,您會收到一條關於ID blah bla的唯一性的錯誤說明:)所以我所做的是我保存了現有項目的ID,然後刪除它在更新被調用之前。 mongodb開發人員也提出了同樣的問題。所以你的代碼應該看起來像:

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

希望這會有所幫助。我也會推薦使用貓鼬。