获取两个日期之间值的差异

时间:2016-11-14 21:49:41

标签: mongodb mongodb-query aggregation-framework

我有这些文件

{
    "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因为在第二个日期不存在

1 个答案:

答案 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" 
                    ]} 
                ] 
            } 
        }} 
    ]
)