2016-01-07 79 views
2

給定的文檔結構,因爲這符合所有蒙戈文件:查找該陣列中的最高值的查詢

{ 
    values: [ 
     { value: 10 }, 
     { value: 20 }, 
     { value: 30 } 
    ] 
} 

我想搜索所有文件,爲其在該最大值數組匹配查詢。

例如。如果我搜索所有文件的最大值小於25,那麼上面的例子將不匹配,因爲30> 25.

我該怎麼做?

+0

你是什麼意思*最新日期*你能用預期結果顯示樣本文件嗎? – styvane

+0

嗨。我簡化了示例以使請求更清晰。 – tarmes

回答

4

使用.aggregate()方法,它提供了訪問。到聚合管道

如果您在版本3.2或更高版本管道中唯一的階段是$redact,其中您使用$$KEEP$$PRUNE變量返回或丟棄與您的標準不匹配的文檔。在$cond表達式使用$max操作者在由所述$map操作者的「值」數組返回返回最大值,因爲如文檔中提到的$redact階段:

集成了的$project$match

功能
db.collection.aggregate([ 
    { "$redact": { 
     "$cond": [ 
      { "$lt": [ 
       { "$max": { 
        "$map": { 
         "input": "$values", 
         "as": "value", 
         "in": "$$value.value" 
        } 
       }}, 
       25 
      ]}, 
      "$$KEEP", 
      "$$PRUNE" 
     ] 
    }} 
]) 

從版本3.0落後,你需要先使用$unwind運算符然後$group你的文件_id來非規範化你的「值」數組;使用$max計算最大值,並使用$push累加器運算符返回values的數組。最後一個階段是$redact階段。

db.collection.aggregate([ 
    { "$unwind": "$values" }, 
    { "$group": { 
     "_id": "$_id", 
     "maxvalues": { "$max": "$values.value"}, 
     "values": { "$push": "$values" } 
    }}, 
    { "$redact": { 
     "$cond": [ 
      { "$lt": [ "$maxvalues", 25 ] }, 
      "$$KEEP", 
      "$$PRUNE" 
     ] 
    }} 
]) 
1

這是一個聚合工作。您將需要創建一個管道,該管道是Date數組,它將返回一個文檔數組,其中每個Date數組中的一個。

例如:

{ "_id" : 1, "dates.startAt": [ date1, date2, date3] } 

將成爲

[{"_id" : 1, "dates.startAt": date1}, 
{"_id" : 1, "dates.startAt": date2}, 
{"_id" : 1, "dates.startAt": date3}] 

結合$ max和$組(見full list of aggregation expressions],你應該設置