2011-12-26 189 views
3

我有這樣的一種模式的文件:MongoDB:查詢嵌套數組中的值?

{ 
    ... 
    "coverages" : [ 
    [ 
     "GB", 
     "WC1" 
    ], 
    [ 
     "GB", 
     "SE2" 
    ], 
    ... 
    ] 
} 

我想找到其中「覆蓋範圍」包含數組第二個元素,其中以「WC」開頭的所有文件,即覆蓋範圍與[「GB」匹配,/^ WC /]。

有沒有辦法用標準的mongodb查詢語言來做到這一點?

我想這可能與自定義JavaScript函數很容易做到的,但文件說,這是很慢...

謝謝!

P.S.我想避免更改架構。

更新:有涉及錯誤/ misfeture在蒙戈:https://jira.mongodb.org/browse/SERVER-1264

+0

你意識到了覆蓋範圍關鍵包含列表的列表?只是想確保你是故意這樣做的。 – 2011-12-27 16:21:34

+0

我的不好,我很懶,沒有提到,'coverage'是很長的配對列表= \ – Alexander 2011-12-28 15:48:24

回答

5

我想這應該工作:

db.mycollection.find({"coverages": {"$elemMatch": {"2": /^WC/}}}) 
+0

只是注意到你已經給出了「coverage」作爲一個數組的數組,這是一個錯字還是它是怎麼回事?如果這是你的模式的定義方式,那麼將查詢改爲「coverage」.0.1「 – Ninja 2011-12-27 16:44:23

+0

是的,實際上它是很長的數組(對)。我想知道是否可以在不改變模式的情況下查詢它,這就是這個問題的原因:) – Alexander 2011-12-28 15:52:06

+0

我編輯了代碼基於已添加的編輯示例 – Ninja 2012-01-01 15:46:06

0

db.collection.find({ "coverages.0.1": /^WC/ })應該做的伎倆。它是說,匹配關鍵coverage中第一個數組的第二個元素以WC開頭的文檔。

但是,如果您嘗試將GB(數組中的第一項)與數組中的第二項關聯,則這是一個錯誤的模式。

這是將鍵映射到值的文檔/對象/字典的自然例子。

讓這樣的:

{ 
    "coverages" : { "GB": "WC1" } 
} 

現在查詢你的邏輯更自然匹配:db.collection.find({ "coverages.gb": /^WC/ })

+1

我編輯過的例子:coverage包含了不止一個元素,所以我想你的方法不會工作:(我相信這種情況下的自然蒙戈模式應該看起來像「覆蓋」:[{「country」:「GB」,「region」:「WC1」},...]。 – Alexander 2011-12-28 15:50:38

+0

但仍然可以通過查詢這個數組我剛剛發現了mongo .. – Alexander 2011-12-28 15:55:02