使用mongodb连续显示所有数据

时间:2016-04-25 07:12:55

标签: mongodb aggregation-framework nosql

我有一个集合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,但它仅适用于数组。

1 个答案:

答案 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值。仅在文档按定义的顺序定义时才定义订单。