我有一个集合myCollection,
ID DateTime myID Cost Flag
1 '2016-07-01T00:00:00' 2048 1 'O'
2 '2016-07-02T00:00:00' 2049 2 'O'
如果我为它编写SQL查询
"select DateTime, myID,Flag, min(Cost) from myCollection group by DateTime, myID"
它将显示数据中的所有字段,例如
DateTime, myID,Flag, min(Cost)
但是在mongo聚合框架中我可以像
一样分组db.myCollection.aggregate([
{
$group: {
_id: {
DateTime: '$DateTime',
myID: '$myID'
},
minCost: { $min: '$Cost' }
}
}
])
将返回我
DateTime, myID, min(Cost)
但我在单个查询中也需要"Flag"
字段。我尝试了$Push
,但它仅适用于数组。
答案 0 :(得分:1)
在SQL Server中,查询
select DateTime, myID,Flag, min(Cost) from myCollection group by DateTime, myID
在选择列表中无效,因为列Flag
未包含在聚合函数或GROUP BY子句中。
在MongoDB中,为了能够在聚合查询中包含字段Flag
,您必须在字段上应用累加器运算符,在这种情况下,您可以使用 $first
< / strong>或 $last
累加器运算符返回聚合中的字段值。
db.myCollection.aggregate([
{
"$group": {
"_id": {
"DateTime": '$DateTime',
"myID": '$myID'
},
"minCost": { "$min": '$Cost' },
"Flag": { "$first": '$Flag' }
}
}
])
在上面,在Flag字段上应用的 $first
累加器运算符将从每个组的第一个文档返回Flag
值。仅在文档按定义的顺序定义时才定义订单。