给出如下文档结构:
{
values: [
{ value: 10 },
{ value: 20 },
{ value: 30 }
]
}
我想搜索数组中最大值与查询匹配的所有文档。
例如。如果我搜索最大值小于25的所有文档,那么上面的示例将不匹配,因为30> 25。
我该怎么做?
答案 0 :(得分:4)
使用.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"
]
}}
])
阶段文档:
的功能
_id
从版本3.0向后,您需要首先使用$unwind
运算符对“值”数组进行反规范化,然后$max
将文档values
归结为$redact
;使用db.collection.aggregate([
{ "$unwind": "$values" },
{ "$group": {
"_id": "$_id",
"maxvalues": { "$max": "$values.value"},
"values": { "$push": "$values" }
}},
{ "$redact": {
"$cond": [
{ "$lt": [ "$maxvalues", 25 ] },
"$$KEEP",
"$$PRUNE"
]
}}
])
计算最大值并使用$group
累加器运算符返回{{1}}数组。最后一个阶段是{{1}}阶段。
{{1}}
答案 1 :(得分:1)
这是聚合的工作。您需要创建一个$unwind Date数组的管道,它将返回一个文档数组,每个数组对应一个数据。
前:
{ "_id" : 1, "dates.startAt": [ date1, date2, date3] }
会变成
[{"_id" : 1, "dates.startAt": date1},
{"_id" : 1, "dates.startAt": date2},
{"_id" : 1, "dates.startAt": date3}]
结合$ max和$ group(请参阅full list of aggregation expressions],您应该设置。