。
下面是使用的代码,使用下面的查询获取每日唯一记录,如何编写查询以获取每周唯一记录,如果可能的话,一周内(星期一至星期五)仅5天唯一计数,我们该如何每天修改唯一记录计数以下查询可获取每周唯一记录计数。
db.custom.aggregate([
{
$match: {
"loginLogoutTime": {
"$gte": ISODate("2020-04-10T14:30:00.000-0400"),
"$lt": ISODate("2020-04-11T14:32:00.000-0400")
}
}
},
{
$group: {
_id: {Dates: {$dateToString: {format: "%Y-%m-%d", date: "$loginLogoutTime"}}, Role: "$customROLE"},
uniqueCount: {$addToSet: "$id"}
}
},
{
$project: {
"_id": NumberInt(0),
"Dates": "$_id.Dates",
"ROLE": "$_id.Role",
"TOTALUSERS": {$size: "$uniqueCount"}
}
}
])
the output looks from above query:
"Dates" : "2020-04-10",
"ROLE" : "PFS_CW_TECH",
"TOTALUSERS" : 374
"Dates" : "2020-06-16",
"ROLE" : "CFS_CW_TECH",
"TOTALUSERS" : 277
还有Schema对象集合:
/* 1 */
{
"_id" : 55,
"id" : "dm4955",
"host" : "iefs-las.web.lh.com",
"Role" : "CFS_CW_TECH",
"event" : "TIMEOUT",
"timeoutTimeStamp" : ISODate("2018-10-26T14:33:13.000Z"),
"lastupdatedTimeStamp" : ISODate("2018-10-26T18:33:14.663Z"),
"recordPublishIndicator" : "Y",
"__v" : 0
}
/* 2 */
{
"_id" : 38,
"attUid" : "mo441b",
"host" : "iefs-las.web.lh.com",
"Role" : "PFS_CW_TECH",
"event" : "LOGIN",
"loginLogoutTime" : ISODate("2018-10-26T14:41:34.000Z"),
"lastupdatedTimeStamp" : ISODate("2018-10-26T14:41:35.220Z"),
"recordPublishIndicator" : "Y",
"__v" : 0
}
从上面的查询中获取角色名称的每日唯一记录数:例如:对于上述查询输出中的每日唯一记录数,例如一周的每日记录(Mond-fri),如何修改查询以获取groupby角色名称的唯一数。
"Dates" : "2020-04-10",
"ROLE" : "PFS_CW_TECH",
"TOTALUSERS" : 374
"Dates" : "2020-04-12",
"ROLE" : "PFS_CW_TECH",
"TOTALUSERS" : 384
"Dates" : "2020-06-16",
"ROLE" : "CFS_CW_TECH",
"TOTALUSERS" : 277
您可以使用下面的汇总查询来获取唯一的每周记录。
db.custom.aggregate([
{
$match: {
"loginLogoutTime": {
"$gte": ISODate("2020-04-10T14:30:00.000-0400"),
"$lt": ISODate("2020-04-11T14:32:00.000-0400")
}
}
},
{
$group: {
_id: {Dates: {$week: "$start_date"}, Role: "$role"},
uniqueCount: {$addToSet: "$id"}
}
},
{
$project: {
"_id": NumberInt(0),
"WeekNumber": "$_id.Dates",
"ROLE": "$_id.Role",
"TOTALUSERS": {$size: "$uniqueCount"}
}
}
])
这种方法的缺点是,尽管可以进行预测并获得
$group
阶段中的实际日期,但是您将获得分组日期的星期数而不是完整日期。
为了获得一周(即星期一至星期五)的工作日计数,您可以使用下面的汇总查询。
db.custom.aggregate([
{
$match: {
"loginLogoutTime": {
"$gte": ISODate("2020-04-10T14:30:00.000-0400"),
"$lt": ISODate("2020-04-11T14:32:00.000-0400")
},
"$expr": {
"$and": [
{"$gt": [{"$dayOfWeek": "$start_date"}, 1]},
{"$lt": [{"$dayOfWeek": "$start_date"}, 7]}
]
},
}
},
{
$group: {
_id: {Dates: {$week: "$start_date"}, Role: "$role"},
uniqueCount: {$addToSet: "$id"}
}
},
{
$project: {
"_id": NumberInt(0),
"WeekNumber": "$_id.Dates",
"ROLE": "$_id.Role",
"TOTALUSERS": {$size: "$uniqueCount"}
}
}
])
更新:以下汇总将根据注释部分中讨论的您的要求进行操作。
db.custom.aggregate([
{
$match: {
"loginLogoutTime": {
"$gte": ISODate("2020-01-10T14:30:00.000-0400"),
"$lt": ISODate("2020-09-11T14:32:00.000-0400")
},
"$expr": {
"$and": [
{"$gt": [{"$dayOfWeek": "$loginLogoutTime"}, 1]},
{"$lt": [{"$dayOfWeek": "$loginLogoutTime"}, 7]}
]
},
}
},
{
$group: {
_id: {
"Date": {
$dateToString: {
format: "%Y-%m-%d",
date: "$loginLogoutTime"
}
},
"weekNumber": {
$dateToString: {
format: "%Y-%m",
date: "$loginLogoutTime"
}
},
"role": "$customROLE",
},
uniqueDayCount: {"$addToSet": "$_id"},
}
},
{
$group: {
_id: {"weekNumber": "$_id.weekNumber", Role: "$_id.role"},
"TOTALUSERS": {$sum: {$size: "$uniqueDayCount"}},
}
},
], { allowDiskUse: true})
我还建议索引loginLogoutTime
以实现最佳查询性能
db.custom.createIndex({"loginLogoutTime": 1})
注意:我尚未测试查询结果,因此请在出现任何错误的情况下进行报告
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句