給定的文檔結構,因爲這符合所有蒙戈文件:查找該陣列中的最高值的查詢
{
values: [
{ value: 10 },
{ value: 20 },
{ value: 30 }
]
}
我想搜索所有文件,爲其在該最大值數組匹配查詢。
例如。如果我搜索所有文件的最大值小於25,那麼上面的例子將不匹配,因爲30> 25.
我該怎麼做?
給定的文檔結構,因爲這符合所有蒙戈文件:查找該陣列中的最高值的查詢
{
values: [
{ value: 10 },
{ value: 20 },
{ value: 30 }
]
}
我想搜索所有文件,爲其在該最大值數組匹配查詢。
例如。如果我搜索所有文件的最大值小於25,那麼上面的例子將不匹配,因爲30> 25.
我該怎麼做?
使用.aggregate()
方法,它提供了訪問。到聚合管道
如果您在版本3.2或更高版本管道中唯一的階段是$redact
,其中您使用$$KEEP
和$$PRUNE
變量返回或丟棄與您的標準不匹配的文檔。在$cond
表達式使用$max
操作者在由所述$map
操作者的「值」數組返回返回最大值,因爲如文檔中提到的$redact
階段:
功能
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"
]
}}
])
這是一個聚合工作。您將需要創建一個管道,該管道是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],你應該設置
你是什麼意思*最新日期*你能用預期結果顯示樣本文件嗎? – styvane
嗨。我簡化了示例以使請求更清晰。 – tarmes