2013-06-25 50 views
32

我已經問這是關於another問題的評論,並且在mongodb用戶上也發佈了question。到目前爲止沒有迴應,所以我正在求助於另一個問題。MongoDB嵌套數組查詢

documentation狀態:

如果字段保持的陣列,則在操作員將$選擇 文檔其字段保存包含指定數組中相匹配的值的至少一個 元素的數組(例如, 等)

我使用:

mongod --version: 
db version v2.2.2, pdfile version 4.5 
Thu May 30 12:19:12 git version: d1b43b61a5308c4ad0679d34b262c5af9d664267 

mongo --version: 
MongoDB shell version: 2.0.4 

在MongoDB中殼:

db.nested.insert({'level1': {'level2': [['item00', 'item01'], ['item10', 'item11']]}}) 

這裏是一個要根據文檔的查詢工作的清單,結果他們生產:

爲什麼不這項工作?

> db.nested.findOne({'level1.level2.0': 'item00'}) 
null 

爲什麼我需要$ all?

> db.nested.findOne({'level1.level2.0': {'$all': ['item00']}}) 
{ 
    "_id" : ObjectId("51a7a4c0909dfd8872f52ed7"), 
    "level1" : { 
     "level2" : [ 
      [ 
       "item00", 
       "item01" 
      ], 
      [ 
       "item10", 
       "item11" 
      ] 
     ] 
    } 
} 

以下至少一項應該可以正常工作嗎?

> db.nested.findOne({'level1.level2.0': {'$in': ['item00']}}) 
null 

> db.nested.findOne({'level1.level2': {'$in': ['item00']}}) 
null 

任何想法?如果查詢語法不能像宣傳的那樣工作,我們正在考慮放棄MongoDB。

謝謝!

回答

6

使用嵌套elemMatch來搜索數組中的嵌套級別。

詳情here

4

簡答:$ in是單值字段,$ all是數組。

首先,db.nested.findOne({'level1.level2.0': 'item00'})不起作用,因爲level1.level2.0包含一個數組,並且您試圖將其與單個值進行比較。

現在,db.nested.findOne({'level1.level2.0': {'$in': ['item00']}})由於類似的原因不起作用。 $ in用於將字段與單個值(您有一個數組)中的幾個值(在查詢中指定)進行比較。 $ in的意思是:給我的文檔有這個字段,這個值包含在這個數組中。

$ all正在工作,因爲它說:給我這個字段有幾個值的文檔,並且該數組的所有值(在查詢中)都包含在該字段中。 (編輯)

可能很難獲得,但看什麼文件說每個:

$所有選擇其中領域持有陣列的文件,包含了所有元素(e.g. <value>, <value1>, etc.)在陣列。

$在選擇其中字段值指定數組e.g. <value1>, <value2>, etc.

希望它可以幫助

+0

感謝您花時間回覆,但不幸的是,您的答案都不正確。在手冊的「Read」頁面中,搜索「以下操作將光標返回到bios集合中的所有文檔,其中數組字段contribs包含元素'UNIX':」在我的問題頂部附近的文檔鏈接中,你可以看到$ in應該在包含數組的字段上工作。最後,您的語句「$ all正在工作,因爲...」是錯誤的:字段中的所有值都不需要存在於查詢中,但查詢中的所有值都必須存在於文檔的字段中。 – dgorur

+0

感謝您爲「$ all正在工作,因爲......」中的更正。所以你在說$ in應該適用於數組,而且文檔是這樣說的。現在我很感興趣。我會做一些實驗,看看我是否知道。你在這裏有一個非常有趣的問題! – AntonioOtero

+0

我把我的發現放在另一個答案中,我希望它對你有用。 – AntonioOtero

29

運行一些查詢後在等於任何價值的文件,我得出的結論是$ in不適用於數組陣列

您可以使用$elemMatch來代替它,但它會工作,但令人沮喪的是MongoDB的文檔沒有警告它。

我創建這個文件:

{ 
     "_id": "51cb12857124a215940cf2d4", 
     "level1": [ 
     [ 
      "item00", 
      "item01" 
     ], 
     [ 
      "item10", 
      "item11" 
     ] 
     ], 
     "items": [ 
     "item20", 
     "item21" 
     ] 
} 

注意的領域「項目」是一個字符串數組,這個查詢工作完美:

db.nested.findOne({"items":{"$in":["item20"]} }) 

現在,「level1.0」也一個字符串數組,唯一的區別是它在另一個數組中。該查詢應該工作,但不是:

db.nested.findOne({"level1.0":{"$in":["item00"]} }) 

得到結果的唯一方法是使用$ elemMatch:

db.nested.findOne({"level1":{"$elemMatch":{"$in":['item00']}} }) 

所以$elemMatch解決了這個問題,但真正的解決方案是更新MongoDB的文檔指出$in不適用於數組數組。也許你應該向10gen提交請求。

+1

呵呵。現在你說。我對某些查詢使用了這種解決方法,但是:如果我想使用$ nin,該怎麼辦?同樣的神祕行爲出現了,然後我們開始懷疑我們得到的所有查詢結果。另外,感謝「陣列數組」術語。 – dgorur