Mongodb 需要查找每周的登录次数

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

我有两个收藏。我试图根据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周内每个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
}
}
}
]);

您需要使用各种聚合管道阶段来转换数据

基于数据处理管道的概念进行建模。文档进入一个多阶段管道,该管道将文档转换为聚合结果

可以使用聚合管道中的以下阶段和操作符来实现您的用例:

  • 执行以加入两个集合
  • 使用,根据周和组织名称分组查找登录次数
  • 用于获取当前周与loggedTime中可用周之间的周差
  • 用于根据过去5周的每周进行分组
  • 最后,将数据转换为所需的格式
  • 请参见工作示例:


    这听起来像是一份工作。也许需要一个开始。@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"
        }
      }
    ])