我有这些文件
{
"url" : "/url1.php",
"date" : ISODate("2016-01-02T00:00:00.000Z"),
"hits" : 104
},
{
"url" : "/url2.php",
"date" : ISODate("2016-01-02T00:00:00.000Z"),
"hits" : 121
},
{
"url" : "/url3.php",
"date" : ISODate("2016-01-02T00:00:00.000Z"),
"hits" : 75
},
{
"url" : "/url1.php",
"date" : ISODate("2016-05-11T00:00:00.000Z"),
"hits" : 100
},
{
"url" : "/url2.php",
"date" : ISODate("2016-05-11T00:00:00.000Z"),
"hits" : 104
}
我希望两个日期之间有所不同,按这种差异排序。如果某些文件在第二个日期不存在,那么差异就是第一个值。
{
"url" : "/url1.php",
"diff": 4
},
{
"url" : "/url2.php",
"diff": 17
},
{
"url" : "/url3.php",
"diff": 75
}
url3.php在第二个日期不存在。
我试过这个
db.collection.aggregate(
{
$match :
{
$or:[{"date":{$gte:ISODate("2016-01-02"),$lte:ISODate("2016-01-02")}},{"date":{$gte:ISODate("2016-05-11"),$lte:ISODate("2016-05-11")}}],
}
},
{$group:{_id:{"url":"$url",month:{$month:"$date"}},total:{"$sum":"$visitas"}}},
{$group:{_id:{"url":"$_id.url",super:{"$subtract":[{$max:"$total"},{$min:"$total"}]}},max:{$first:"$total"},min:{$last:"$total"}}},
{$group:{_id:{"url":"$_id.url",difference:{"$subtract":["$max","$min"]},"dateHight":"$max","dateLow":"$min","diff2":"$super"}}},
{$unwind:"$_id.difference"},
{$match:{"_id.difference":{$ne:0}}},
{$sort:{"_id.difference":-1}}
)
这个节目
{
"url" : "/url1.php",
"diff": 4
},
{
"url" : "/url2.php",
"diff": 17
}
但不是url3.php因为在第二个日期不存在
答案 0 :(得分:1)
您需要按“日期”按升序顺序首先$sort
您的文档。从那里,然后你通过“url”$group
。初步排序阶段允许我们使用$first
操作员及其犯罪伙伴$last
来返回第一个和最后一个“命中”。
但这还不够,我们还需要返回每组文档的数量。这是因为我们需要在$cond
中执行逻辑$project
ition处理。这里的条件是meteor npm install --save bcrypt
,当我们在组中只有一个文档时返回true,否则返回false。然后,我们将第一个匹配设置为$eq
作为表达式的返回值。
0
查询产生以下结果。
db.collection.aggregate(
[
{ "$sort": { "date": -1 } },
{ "$group": {
"_id": "$url",
"lastHit": { "$last": "$hits" },
"firstHit": { "$first": "$hits" },
"count": { "$sum": 1 }
}},
{ "$project": {
"diff": {
"$subtract": [
"$lastHit",
{ "$cond": [
{ "$eq": [ "$count", 1 ] },
0,
"$firstHit"
]}
]
}
}}
]
)