Mongodb 需要查找每周的登录次数
我有两个收藏。我试图根据LoggedTime字段查找登录次数。 我想获得过去五周每周的登录次数 我有两个收藏 集合1:角色Mongodb 需要查找每周的登录次数,mongodb,mongodb-query,Mongodb,Mongodb Query,我有两个收藏。我试图根据LoggedTime字段查找登录次数。 我想获得过去五周每周的登录次数 我有两个收藏 集合1:角色 字段:角色、用户名、日志时间 收藏2:mysite 字段:用户名、用户电子邮件、名称 在集合1中,例如: { 'Role' :"admin" 'UserName' : "abc.efg", 'loggedTime' : 2020-06-24T18:12:03.455Z, } 在集合2中,例如: { 'userName' : &quo
字段:角色、用户名、日志时间 收藏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周内每个orgname每周的登录次数(基于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'
}
要实现这一点,您需要查看聚合框架。
具体来说,给定给定的数据样本:
- $lookup从用户名中获取组织(以及$unwind以清除查找输出)
- $group每周实际获得每个组织的登录
- $out将其转储到新集合中(或者只处理输出并自己插入)
请注意,这不会输出到新集合,也不会处理“previous,3rd,…”
db={
“登录”:[
{
“角色”:“管理员”,
“用户名”:“abc”,
“loggedTime”:新日期(“2020-06-24T18:12:03.455Z”)
},
{
“角色”:“管理员”,
“用户名”:“abc”,
“loggedTime”:新日期(“2020-06-24T19:12:03.455Z”)
},
{
“角色”:“管理员”,
“用户名”:“xyz”,
“loggedTime”:新日期(“2020-07-24T19:12:03.455Z”)
}
],
“用户”:[
{
“用户名”:“abc”,
“用户电子邮件”:abc@abc.com",
“组织”:“abc”
},
{
“用户名”:“xyz”,
“用户电子邮件”:xyz@xyz.com",
“组织”:“xyz”
}
]
}
db.logins.aggregate([
{
/**使用用户名查找组织*/
“$lookup”:{
“发件人”:“用户”,
“localField”:“用户名”,
“foreignField”:“用户名”,
“作为”:“用户”
}
},
{
/**查找创建一个结果数组*/
/**我们应该只有一个有最新数据的*/
/**所以我们可以放松一下*/
“$unwind”:“$user”
},
{
$group:{
“_id”:{
/**按年度、周和组织分组*/
年份:{
$year:“$loggedTime”
},
周:{
$week:“$loggedTime”
},
组织:“$user.org”
},
计数:{
$sum:1
}
}
}
]);
您需要使用各种聚合管道阶段来转换数据
基于数据处理管道的概念进行建模。文档进入一个多阶段管道,该管道将文档转换为聚合结果
可以使用聚合管道中的以下阶段和操作符来实现您的用例:
这听起来像是一份工作。也许需要一个开始。@Ad1995如果您需要更详细的解释,请告诉我。嗨..谢谢您的帮助…查询非常有用,只是当有重复记录(集合2中的相同名称、相同组织)时,计数会加倍。除此之外,这个问题是完美的。
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"
}
}
])