mongodb group by a field and count all from a field

时间:2015-12-04 12:12:52

标签: mongodb

我正在尝试解决这个小问题,我试图搜索一轮寻求帮助,但我无法在任何地方找到帮助,所以我试图在这里问。

我尝试从访客日志中获取最顶级的视图产品,我的mongodb中的数据看起来像这样

{
    "_id" : ObjectId("56617f12cc8eaaa6010041ab"),
    "Product" : {
        "UUID" : "c7b3e23e-0bf9-4fd5-b8d3-f559b80c42ed"
    },
    "Log" : {
        "Method" : "visit",
        "IP" : "127.0.0.1",
        "Added" : "2015-12-04 12:54:58"
    }
}

我想要的是在Product.UUID字段上创建一个组,并且所有日志都不早于1.5个月,我现在所做的就是这样。

db.getCollection('log-product').aggregate([
    {
        "$group" : {
            _id:"$Product.UUID",
            total: {$sum : 1}
        }
     },
    {"$sort" : {total: -1}},
    {"$limit" : 8}
])

这里我对Product.UUID进行分组,并根据总数计算DESC并将其限制为8,我的问题是我无法找到计算单个产品有多少访问者的方法。

希望有人可以帮我解决这个问题。

2 个答案:

答案 0 :(得分:3)

您需要先按时间间隔过滤“Log.Added”,然后将结果传递给$ group:

db.getCollection('log-product').aggregate([
        {
            "$match": {
                "Log.Added": { $gt: new Date(2015,10, 15), $lt: new Date(2015,11,15) }
            }   
        },
        {
            "$group" : {
                _id:"$Product.UUID",
                total: {$sum : 1}
            }
         },
        {"$sort" : {total: -1}},
        {"$limit" : 8}
    ])

答案 1 :(得分:0)

您可以按Log.Added进行过滤,并按产品uuid和$ Log.IP进行过滤:

var currentDate = new Date();
var dateOffset = (24*60*60*1000) * 45;

var initInterval = new Date(new Date() - dateOffset);
db.getCollection('log-product').aggregate([
        { "$match" : { "Log.Added": {$lte: currentDate, $gte: initInterval}}},
        {
            "$group" : {
                _id:{"product": "$Product.UUID", "visitor":"$Log.IP"},
                total: {$sum : 1}
            }
         },
        {"$sort" : {total: -1}},
        {"$limit" : 8}
    ])