如何通过分组

时间:2015-11-01 00:17:32

标签: mongodb mongodb-query aggregation-framework

我正在制作一个项目,要求我先计算每天的行程距离。然后根据这些数据,我要了解如何显示特定周的最大,最小和平均距离是多少? 这是我写的mongoDB脚本。

db = connect("localhost:27017/mydb");
var result = db.trips.aggregate([
{
    "$unwind" : "$trips"
},
{
    "$match" : {
        "trips.startTime" : {"$lte" : ISODate("2015-10-31T23:59:59Z"), "$gte" : ISODate("2015-10-25T00:00:00Z")}
    }
},
{
    "$group" :
    {
        "_id" : {
            "date" : {"$dayOfMonth" : "$trips.startTime"}
        },
        "distance" :{"$sum" : "$trips.distance"}
    }
}
]);
while(result.hasNext())
{
    print(tojson(result.next()));
}

当被动态日期替换时,它给出了正确的值。 现在它给我留下了两个选项,要么修改当前组查询,要么编写双组查询。双组查询似乎是一种更有效的方法。我试图写这样的查询。

{
    "$group" :
    {
        "_id" : { 
            "week" : "$_id.date" 
        },
        "max-distance" : {
            "$max" : "$distance"
        }
    }
}

添加这些行并没有什么不同,显然我知道我做错了,但是如何纠正它。我需要帮助 感谢

1 个答案:

答案 0 :(得分:1)

您似乎想要$week运算符,但当然您需要一个有效的int wereld::parameters (){ ----- keuze = leesoptie ( ); switch (keuze) { case 'T': case 't': return 0; --- 作为输入才能从中提取“周”。

您可能不知道的是,您可以使用“日期数学”将日期四舍五入到“日”,其中结果仍然是Date个对象。然后,您可以使用Date运算符获取$week值:

$max

第一部分的基本技巧是当你从另一个$subtract一个db.trips.aggregate([ { "$unwind" : "$trips" }, { "$match": { "trips.startTime" : { "$lte": ISODate("2015-10-31T23:59:59Z"), "$gte": ISODate("2015-10-25T00:00:00Z") } }}, { "$group": { "_id": { "$add": [ { "$subtract": [ { "$subtract": [ "$trips.startTime", new Date(0) ] }, { "$mod": [ { "$subtract": [ "$trips.startTime", new Date(0) ] }, 1000 * 60 * 60 * 24 ]} ]}, new Date(0) ] }, "distance": { "$sum": "$trips.distance" } }}, { "$group": { "_id": { "$week": "$_id" }, "max-distance": { "$max": "$distance" } } ]); 个对象时,结果是毫秒差异。因此,使用纪元日期将数据转换为等效的毫秒数,然后您可以使用数学将该数字舍入为一天。

Date是一天中的毫秒数,因此找到其中的模数($mod)将返回当天剩余的milleseconds,您可以从文档中的日期值中减去一天到晚。

(1000 * 60 * 60 * 24)向数字添加$add对象时也是如此,结果为Date。因此,这会处理转换,然后可以从那里提取Date