2012-04-06 62 views
0

我有一個奇怪的問題,我似乎無法解釋。鑑於以下內容:node-mongodb findOne behavior

Generics.prototype.getCollection= function(collection,callback) { 
    this.db.collection(collection, function(error, document_collection) { 
    if(error) callback(error); 
    else callback(null, document_collection); 
    }); 
}; 

Generics.prototype.findById = function(collection, id, callback) { 
    this.getCollection(collection,function(error, document_collection) { 
     if(error) callback(error) 
     else { 
     document_collection.findOne({_id: document_collection.db.bson_serializer.ObjectID.createFromHexString(id)}, function(error, result) { 
      if(error) callback(error) 
      else callback(null, result) 
     }); 
     } 
    }); 
}; 

Generics.prototype.findOne = function(collection, _key, _value, callback) { 
    this.getCollection(collection,function(error, document_collection) { 
     if(error) callback(error) 
     else { 
     document_collection.findOne({_key:_value}, function(error, result) { 
      if(error) callback(error) 
      else callback(null, result) 
     }); 
     } 
    }); 
}; 

findById的作品就像一個魅力。但是,findOne執行時總是返回null。我啓動了節點調試器以查明交易是什麼,並且我發現其中一個傳遞的變量以某種方式被銷燬/擦除。 _key似乎總是被刪除。然而_value總是在那裏。我嘗試將_key重命名爲其他內容,無論如何,它總是被刪除。任何想法可能會發生什麼,將不勝感激。謝謝!

更新 我只是重構了一下,允許更靈活的搜索查詢,並使其與一個可變的工作。我仍然想知道發生了什麼事。我覺得這是一些關閉業務,我不太理解。

​​

回答

1

的Javascript總是把對象的鍵爲一個字符串,如果你使用{}語法像你一樣當你把它傳遞給findOne方法:

{_key:_value} 

換句話說,對象以上基本上被視爲:

{ '_key': _value } 

我不認爲是你想要的。要克服這種情況的一個常用方法是創建一個對象,並使用[]操作是這樣的:

var temp = {}; 
temp[_key] = _value; // here, the _temp symbol is interpreted as a js variable 
+0

這不是我試圖做其實我真的想哈希事實證明。將引號中的鍵名括起來是Python的一種習慣:)問題是爲什麼「_key」變量被燒燬並且「_value」變量存活。我無法通過代碼來找出原因。 – 2012-04-09 17:46:26

+0

對不起,我不太贊同你的說法。你是什​​麼意思你想要散列?你習慣用引號括住密鑰是什麼意思(因爲我沒有看到它們在你的代碼中)?爲了澄清我的答案,var someKey ='abcd'; var o = {someKey:'z'};會給你一個o {'someKey':'z'}而不是{'abcd':'z'}。 – Ren 2012-04-17 14:15:40