Mongo聚合基于匹配/排序/切片/组查询的数组中查找元素



我正在尝试编写以下管道查询

{
    "_id" : 1,
    "createdDate" : "2018-01-01 00:00:00",
    "visits" : [ 
        {
            "date" : "2018-02-01 00:00:00",
            "type" : "A",
        }, 
        {
            "date" : "2018-03-01 00:00:00",
            "type" : "B",
        }]
    "user" : "Alpha"
},
{
    "_id" : 1,
    "createdDate" : "2018-01-15 00:00:00",
    "visits" : [ 
        {
            "date" : "2018-02-01 00:00:00",
            "type" : "B",
        }, 
        {
            "date" : "2018-04-08 00:00:00",
            "type" : "A",
        }]
    "user" : "Alpha"
}

我想

  • 按用户分组
  • 获取记录数
  • 基于日期筛选器
  • 要选择的最新类型基于相同的日期过滤器

例:

日期在 2018-01-01 和 2018-02-02 之间

期望的输出

{_id:"Alpha",
type: {"A":1, "B":1},
count : 2}

日期在 2018-01-01 和 2018-03-02 之间

期望的输出

{_id:"Alpha",
type: {"A":0, "B":2},
count : 2}

这就是我到目前为止所得到的

{$match:{ "createdDate":{   "$gte":"2018-01-01 00:00:00",
                            "$lte":"2018-02-02 23:59:59"}     
        }
},
{$unwind:"$visits"},
{$match:{   "visits.date":{ "$gte":"2018-01-01 00:00:00",
                            "$lte":"2018-02-02 23:59:59"}
          }
},
{$project:{_id:1, "visit_type":"$visits.type", "visit_date":"$visits.date"}},
{ $group : {  _id         : "$_id",
              "visits"    :    { "$push": { 
                                    "date": "$visit_date",
                                    "type": "$visit_type"                                        
                                }
                                }
            }
}

你可以试试下面的聚合。

添加了两个组,每个组用于按类型计数,另一个组用于按用户计数。

[
  {"$match":{"createdDate":{"$gte":"2018-01-01 00:00:00","$lte":"2018-03-02 23:59:59"}}},
  {"$unwind":"$visits"},
  {"$match":{"visits.date":{"$gte":"2018-01-01 00:00:00","$lte":"2018-03-02 23:59:59"}}},
  {"$sort":{"visits.date":-1}},
  {"$group":{"_id":{"_id":"$_id","user":"$user"},"latestvisit":{"$first":"$visits"}}},
  {"$group":{"_id":{"user":"$_id.user","type":"$latestvisit.type"},"visits":{"$sum":1}}},
  {"$group":{
    "_id":"$_id.user",
    "type":{"$push":{"type":"$_id.type","visits":"$visits"}},
    "count":{"$sum":"$visits"}
  }}
]

最新更新