2013-05-15 91 views
1

Ahoy!我對MongoDB有一個非常有趣的問題,並且可能更一般地用JSON。基本上,我無意中創建了一些MongoDB文檔,其子文檔包含一個空鍵,例如(我剝ObjectID s到使代碼看起來更漂亮):MongoDB:如何選擇空鍵子文檔?

{ 
    "_id" : ObjectId("..."), 
    "stats" : 
     { 
      "violations" : 0, 
      "cost" : 170, 
     }, 
    "parameters" : 
     { 
      "" : "../instances/comp/comp20.ectt", 
      "repetition" : 29, 
      "time" : 600000 
     }, 
    "batch" : ObjectId("..."), 
    "system" : "Linux 3.5.0-27-generic", 
    "host" : "host3", 
    "date_started" : ISODate("2013-05-14T16:46:46.788Z"), 
    "date_stopped" : ISODate("2013-05-14T16:56:48.483Z"), 
    "copy" : false 
} 

當然,問題是行:

"" : "../instances/comp/comp20.ectt" 

因爲我不能取回字段的值。如果我查詢使用:

db.experiments.find({"batch": ObjectId("...")}, { "parameters.": 1 }) 

什麼,我得到的是parameters子文檔的全部內容。我的猜測是.可能會被忽略,如果跟着一個空的選擇器。從JSON規範(15.12。*)看起來像空鍵是允許的。你對如何解決這個問題有任何想法嗎?

這是一個已知的行爲?這有用嗎?

更新我試過$rename這個字段,但是那樣不行,出於同樣的原因。以.結尾的密鑰不被允許。

更新已申請issue關於MongoDB問題跟蹤器。

感謝,
托馬索

回答

0

我剛纔檢查的代碼,這不現在看起來可能是你提到的原因。由於允許創建長度爲零的字段名稱的文檔,我會認爲這是一個錯誤。順便說https://jira.mongodb.org

,諷刺的是你可以在上面查詢:您在此處進行舉報

> db.c.save({a:{"":1}}) 
> db.c.save({a:{"":2}}) 
> db.c.find({"a.":1}) 
{ "_id" : ObjectId("519349da6bd8a34a4985520a"), "a" : { "" : 1 } } 
+0

好吧,我只是想在提交問題之前確定。 – tunnuz

+0

好的。在此發佈問題鏈接,以便人們在遇到同樣的問題時可以投票。謝謝! –

1

我有同樣的問題。你可以像這樣選擇子文檔:

db.foo.find({"parameters.":{$exists:true}}) 

在「參數」結尾的點告知蒙戈尋找該子文檔中的空項。這適用於Mongo 2.4.x.

Mongo沒有很好地支持空密鑰,我不認爲它們是官方支持的,但是你可以插入數據。所以你不應該使用它們,並且應該在你的系統中找到插入這些密鑰的位置並消除它。