在日期范围内计数不同

Jar*_*red 2 mongodb pymongo mongodb-query aggregation-framework

我有一个包含站点事件集合的MongoDB数据库。这些文档如下所示:

{ 
    "_id" : ObjectId("5785bb02eac0636f1dc07023"), 
    "referrer" : "https://example.com",
    "_t" : ISODate("2016-07-12T18:10:17Z"),
    "_p" : "ucd7+hvjpacuhtgbq1caps4rqepvwzuoxm=", 
    "_n" : "visited site", 
    "km screen resolution" : "1680x1050" 
},

{ 
    "_id" : ObjectId("5785bb02eac0636f1dc07047"), 
    "url" : "https://www.example.com/", 
    "referrer" : "Direct", 
    "_t" : ISODate("2016-07-12T18:10:49Z"), 
    "_p" : "txt6t1siuingcgo483aabmses2et5uqk0=", 
    "_n" : "visited site", 
    "km screen resolution" : "1366x768" 
},

{ 
    "_id" : ObjectId("5785bb02eac0636f1dc07053"), 
    "url" : "https://www.example.com/", 
    "referrer" : "Direct", 
    "_t" : ISODate("2016-07-12T18:10:56Z"), 
    "_p" : "gcama1az5jxa74wa6o9r4v/3k+zulciqiu=", 
    "_n" : "visited site", 
    "km screen resolution" : "1366x768" 
}
Run Code Online (Sandbox Code Playgroud)

我想统计日期范围内的不重复人员。在SQL中

SELECT COUNT(DISTINCT(`_p`)) FROM collection WHERE `_t` > '<SOME DATE>' AND `_t` <= '<SOME OTHER DATE>'
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经使用聚合管道对日期进行了分组:

db.siteEvents.aggregate(

[
    { 
        $match : {"_n": "visited site"}
    },

    {   
        $group : {

            _id: {
            year : { $year : "$_t" },        
            month : { $month : "$_t" },        
            day : { $dayOfMonth : "$_t" },
            _p : "$_p"
        },

        count: { $sum: 1 }

        }
    }, 

    {
        $group : {

            _id : {
            year : { $year : "$_id.year" },        
            month : { $month : "$_id.month" },        
            day : { $dayOfMonth : "$_id.day" }
            },

            count: { $sum: 1 }
        }
    }
]

);
Run Code Online (Sandbox Code Playgroud)

但这会产生错误-我相信由于第二个分组_id试图获取一个中间字段。我目前仅使用Mongo Shell,但如果必须选择其他驱动程序,则为PyMongo。我想在外壳中使用它(这样我就可以理解该过程了)。

DAX*_*lic 5

有了聚合管道,它看起来可能像这样

db.getCollection('siteEvents').aggregate([
    {
        $match: {
            _t: {
                $gt: ISODate("2016-07-11T08:10:17.000Z"),
                $lt: ISODate("2016-07-12T14:10:17.000Z")
            }
        }
    },
    {
        $group: {
            _id: "$_p"
        }
    },
    {
        $group: {
            _id: null,
            distinctCount: { $sum: 1 }
        }
    }
])
Run Code Online (Sandbox Code Playgroud)

如果您知道结果的不同值不会很大,则可以使用像这样的简单查询

db.getCollection('siteEvents').distinct(
    '_p',
    { 
        _t: {
            $gt: ISODate("2016-07-11T08:10:17.000Z"),
            $lt: ISODate("2016-07-12T14:10:17.000Z")
        }
    }).length
Run Code Online (Sandbox Code Playgroud)