我正在制作一个项目,要求我先计算每天的行程距离。然后根据这些数据,我要了解如何显示特定周的最大,最小和平均距离是多少? 这是我写的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"
}
}
}
添加这些行并没有什么不同,显然我知道我做错了,但是如何纠正它。我需要帮助 感谢
答案 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
。