查找数组中max值与查询匹配的所有Mongo文档

时间:2016-01-07 16:01:43

标签: mongodb mongodb-query aggregation-framework

给出如下文档结构:

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

我想搜索数组中最大值与查询匹配的所有文档。

例如。如果我搜索最大值小于25的所有文档,那么上面的示例将不匹配,因为30> 25。

我该怎么做?

2 个答案:

答案 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" ] }} ]) 阶段文档:

  

合并$project$match

的功能
_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],您应该设置。