mongodb - 需要查找每周的登录次数
问题描述
我有两个系列。我正在尝试根据 LoggedTime 字段查找登录次数。我想获得过去五周内每周的登录次数。
我有两个系列。
集合 1:角色
字段:角色、用户名、登录时间
集合 2:mysite
字段:用户名,用户电子邮件,名称
在集合 1 中,例如:
{
'Role' :"admin"
'UserName' : "abc.efg",
'loggedTime' : 2020-06-24T18:12:03.455Z,
}
在集合 2 中,例如:
{
'userName' : "abc Mr, efg" ,
'userEmail' : "abc.efg@company.com" ,
'name' : 'orgname'
}
有什么方法可以让我们拥有一个新集合,其中包含过去 5 周每个组织名称每周登录次数(基于loggedTime)的计数?
基本上试图获得像集合3这样的结果:
{
name :'orgname',
'Logins current week':'no of logins'
'Logins previous week' : 'no of logins'
'Logins 3rd week' :'no of logins'
'Logins 4th week' :'no of logins'
'Logins 5th week': 'no of logins'
}
解决方案
您需要使用各种聚合管道阶段来转换数据。
MongoDB 的聚合框架以数据处理管道的概念为蓝本。文档进入一个多阶段管道,将文档转换为聚合结果。
您可以使用聚合管道中的以下阶段和运算符来实现您的用例:
- 执行$lookup以加入两个集合
- 使用$group,通过基于周和组织名称的分组来查找登录数
- $subtract用于获取当前周与可用周之间的周差
loggedTime
- $facet用于根据过去 5 周的每周进行分组
- 最后,将数据转换为所需的格式
请参阅工作示例:MongoDB Playground
db.Role.aggregate([
{
"$lookup": {
"from": "mysite",
let: {
"userName": "$UserName"
},
"pipeline": [
{
$match: {
"$expr": {
"$ne": [
{
"$indexOfCP": [
"$userEmail",
"$$userName"
]
},
-1
]
}
}
}
],
"as": "mysite"
}
},
{
"$unwind": "$mysite"
},
{
$group: {
_id: {
week: {
$week: "$loggedTime"
},
org: "$mysite.name"
},
documentCount: {
$sum: 1
}
}
},
{
"$addFields": {
"currentWeek": {
$week: "$$NOW"
}
}
},
{
"$addFields": {
dateDifference: {
$subtract: [
"$currentWeek",
"$_id.week"
]
}
}
},
{
$facet: {
current: [
{
$match: {
dateDifference: 0
}
},
{
$project: {
"name": "$_id.org",
_id: 0,
"Loginscurrentweek": "$documentCount"
}
}
],
previous: [
{
$match: {
dateDifference: 1
}
},
{
$project: {
"name": "$_id.org",
_id: 0,
"Loginspreviousweek": "$documentCount"
}
}
],
third: [
{
$match: {
dateDifference: 2
}
},
{
$project: {
"name": "$_id.org",
_id: 0,
"Logins3rdweek": "$documentCount"
}
}
],
fourth: [
{
$match: {
dateDifference: 3
}
},
{
$project: {
"name": "$_id.org",
_id: 0,
"Logins4thweek": "$documentCount"
}
}
],
fifth: [
{
$match: {
dateDifference: 4
}
},
{
$project: {
"name": "$_id.org",
_id: 0,
"Logins5thweek": "$documentCount"
}
}
]
}
},
{
$project: {
"givenWeeks": {
"$concatArrays": [
"$current",
"$fifth",
"$fourth",
"$third",
"$previous"
]
}
}
},
{
$unwind: "$givenWeeks"
},
{
$group: {
_id: "$givenWeeks.name",
val: {
$push: {
"Loginscurrentweek": "$givenWeeks.Loginscurrentweek",
"Loginspreviousweek": "$givenWeeks.Loginspreviousweek",
"Logins3rdweek": "$givenWeeks.Logins3rdweek",
"Logins4thweek": "$givenWeeks.Logins4thweek",
"Logins5thweek": "$givenWeeks.Logins5thweek",
}
}
}
},
{
$project: {
"name": "$_id",
_id: 0,
val: {
"$mergeObjects": "$val"
}
}
},
{
"$project": {
name: 1,
"Logins current week": "$val.Loginscurrentweek",
"Logins previous week": "$val.Loginspreviousweek",
"Logins 3rd week": "$val.Logins3rdweek",
"Logins 4th week": "$val.Logins4thweek",
"Logins 5th week": "$val.Logins5thweek"
}
}
])
推荐阅读
- windows - windows批处理脚本用破折号重命名文件
- windows - botium-cli 模拟器不适用于 rasa 连接器
- javascript - 有没有办法改变 D3.js 折线图上的颜色线?
- firebase - Firebase 身份验证和计费订阅
- c++ - 从文件 c++ 创建一个字符串向量
- java - Couchbase 中的自动增量
- excel - 使用带有动态变量和多个工作表的 INDEX / MATCH 编写 VBA
- ios - SwiftUI 辅助功能 VoiceOver 焦点问题
- python - 遍历数据框会更改列结构
- c# - 时间:2019-05-10 标签:c#repater from JSON without class