2013-12-17 59 views
2

這個(IMO)意外行爲基本上我有我的類模型文件這一功能:如何解決的NodeJS和MongoDB

Categories.prototype.delSubcategory = function(categoryId, subcategory, callback) { 

    var finalSub = "subcategories." + subcategory; 
    finalSub = '"' + finalSub + '"'; 

    this.getCollection(function(error, category_collection) { 

     if(error) callback(error); 

     else { 

      category_collection.update(

       {_id: category_collection.db.bson_deserializer.ObjectID.createFromHexString(categoryId)}, 
       { $unset : { finalSub: "" } }, 
       function(error, subcategory) { 

        if(error) callback(error); 

        else callback(null, subcategory) 

       } 

      ) 

     } 

    }); 

}; 

如果我console.log(finalSub)我會看到"subcategories.myvalue"打印預期。所以,當我在我的應用程序中使用這個函數時,函數應該按預期更新文檔,但是它不會。也沒有顯示任何錯誤。如果我在shell中複製類似的行爲,它將起作用,文檔將相應地更新。

如果,而是採用{ $unset : { finalSub: "" } }我用{ $unset : { "subcategories.myValue": "" } },硬編碼在它的工作函數的值,所以這個問題似乎只有當我在一個變量傳遞一個字符串發生,我不明白爲什麼。

任何想法?

PS:請注意,在這種情況下,前面提到的意思是刪除一個對象內部的一個對象,因此這個empt「」。

回答

0

當你創建這個對象字面:

{ $unset : { finalSub: "" } } 

你得到:

{ "$unset": { "finalSub": "" } } 

這顯然不是你想要的。但是,除非您期望$unset部分拋出ReferenceError,否則它是一致的。你將不得不以不同的方式建立一個對象:

updateObj = { $unset: {} } 
updateObj.$unset[finalSub] = "" 

然後你就可以代替文字的使用updateObj

 updateObj = { $unset: {} } 
     updateObj.$unset[finalSub] = "" 
     category_collection.update(

      {_id: category_collection.db.bson_deserializer.ObjectID.createFromHexString(categoryId)}, 
      updateObj, 
      function(error, subcategory) { 

       if(error) callback(error); 

       else callback(null, subcategory) 

      } 

     ) 
+0

不幸的是,不工作,如,如果我用蒙戈抱怨在以下結構中的前面的代碼:'{updatebj。$ unset [finalSub] =「」}'。事實上,我甚至無法在對象內使用點符號。它看起來幾乎就像對象內的代碼沒有被執行,而是簡單地作爲字符串傳遞。 – WagnerMatosUK

+0

@WagnerMatosUK您似乎無法理解JavaScript中的對象文字是如何工作的。如果您使用我提供的代碼而不是使用文字,它將正常工作。 –

+1

不幸的是,你是對的,我對js很陌生,仍然對事物感到困惑。我試過你的代碼,它似乎沒有工作。可能是因爲我把它放錯了。上面的函數如何在你的代碼中看起來像?我所有的嘗試都失敗了。 – WagnerMatosUK