在mongodb中使用group by子句获取值范围

时间:2015-07-24 11:23:55

标签: mongodb mongodb-query aggregation-framework

我在mongodb有一个这样的集合。

{
  "_id": "1235677",
  "name" : "xyz",
  "time" : ISODate(2015-07-20T09:00:00Z)
},
{
  "_id": "1235677",
  "name" : "xyz",
  "time" : ISODate(2015-07-20T11:00:00Z)
},
{
  "_id": "1235677",
  "name" : "abs",
  "time" : ISODate(2015-07-20T11:00:00Z)
}

如何在数据库中获取Max(时间)减去Min(时间)的名字。相当于这个SQL查询 -

SELECT name, Max(time)-Min(time) from tablename group by name

2 个答案:

答案 0 :(得分:4)

您可以像这样使用aggregation framework MongoDB:

db.collection.aggregate([
    { "$group": {
        "_id": "$name",
        "minTime": { "$min": "$time" },
        "maxTime": { "$max": "$time" }
    }},
    { "$project": {
        "duration": { "$subtract": [ "$minTime", "$maxTime" ] }
    }}
])

您可以使用聚合框架(最佳),不涉及基本(SQL等效)类型的语句:

SELECT something FROM table

此处的操作如下:

  • $group:与“GROUP BY”相同,您可以在其中指定要在_id主键值内聚合的“键”。 $min$max运算符分别与“MIN()”和“MAX()”相同,因为它们充当了将“分组”作为“累加器”的功能。

  • $project是MongoDB术语中一般语法的扩展。这允许您“操纵”现有字段值(在这种情况下,从$group计算到文档中的新值。

    所以在这里,两个值的$subtract都会应用“计算”​​来确定结果。

虽然并不总是给出具体示例,但我强烈建议您查看核心文档的SQL to MongoDB mapping Chart部分。除了查看并完整地学习aggregation operators之外。

答案 1 :(得分:4)

请尝试以下方法:

 db.collection.aggregate([
  { $group:{_id:"$name",maxt: {$max:"$time"}, mint : {$min:"$time"}} },
  { $project: {"_id" : 0 ,"name": "$_id", 
    "time" : {$subtract: ["$mint","$maxt"]}} }
 ]);
相关问题