2016-10-16 112 views
2

在mongo中如果條件匹配,如何從列表中返回所有匹配的dict元素。帶投影的Mongo查詢

這裏是我的數據:

{"packages": [ 
     {"package_name" : "abc", "installed_date" : "2016-08-03"}, 
     {"package_name" : "def", "installed_date" : "2016-08-04"}, 
     {"package_name" : "ghi", "installed_date" : "2016-08-03"}, 
     ] 
    } 

我應該如何查詢來獲取所有符合{"installed_date" : "2016-08-03"}

,我試過詞典:

db.resource.find({packages: {"$elemMatch": {installed_date: "2016-08-03"}}})

但是,這給我的所有數組元素。我想拿到賽{installed_date: "2016-08-03"}

感謝

+0

將空白對象添加爲第一個參數會發生什麼情況:db.resource.find({},{packages:{「$ elemMatch」:{installed_date:「2016-08-03」}}}) – Brian

+0

Doesn看起來沒有工作,它會返回所有其他未包含該日期的包。 –

回答

5

嘗試蒙戈聚集該字典元素:

db.resource.aggregate([ 
    {'$match':{'packages.installed_date':'2016-08-03'}}, 
    {'$unwind':'$packages'}, 
    {'$match':{'packages.installed_date':'2016-08-03'}}, 
    {'$group':{'_id':'$_id', 'packages':{'$push':'$packages'}}} 
]) 
+0

真棒這是工作:) –

1

試試下面的查詢:將MongoDB的3.2

db.resource.aggregate([ 
    {$match:{"packages.installed_date" : "2016-08-03"}}, 
    { $project: { 
     package: {$filter: { 
      input: '$packages', 
      as: 'package', 
      cond: {$eq: ['$$package.installed_date', "2016-08-03"]} 
     }} 
    }} 
]) 

這將工作工作沒有多重比賽條件和$ unwind

+0

謝謝我會嘗試當我升級到3.2 –

+0

偉大的,如果有可能,然後升級到3.2。有很多新的東西和更好的表現。見http://www.slideshare.net/chenghanTsai1/mongodb-300-vs-26x-vs-24x-benchmark – Sachin

2

對於不使用$unwind運營商的解決方案,可以考慮使用$map一起$setDifference,在那裏你可以在「過濾器」數組內容。

這是更有效的,因爲它的單個$project管道內運行,並且也$unwind產生的文檔的笛卡爾乘積,即每個陣列條目中的每個文件,它使用更多的存儲器(在聚合可能的存儲器蓋的副本10%的總存儲器的管道),並因此需要時間來產生在平坦化過程中以及處理所述文件:

db.resource.aggregate([ 
    { 
     "$project": { 
      "packages": { 
       "$setDifference": [ 
        { 
         "$map": { 
          "input": "$packages", 
          "as": "item", 
          "in": { 
           "$cond": [ 
            { "$eq": [ "$$item.installed_date", "2016-08-03" ] }, 
            "$$item", 
            false 
           ] 
          } 
         } 
        }, 
        [false] 
       ] 
      } 
     } 
    } 
]) 

在上述管道中,$map操作者在電子ssence創建一個新的數組字段,該數組字段將值作爲評估邏輯的結果保存在數組的每個元素的子表達式中。

$setDifference運算符然後返回一個集合,其中元素出現在第一個集合中但不出現在第二個集合中;即執行第二組相對於第一組的相對補償。在這種情況下,它將返回包含installed_date = "2016-08-03"元素的最終packages數組。