Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB显示每个用户每天的第一个和最后一个事件_Mongodb_Mongodb Query - Fatal编程技术网

MongoDB显示每个用户每天的第一个和最后一个事件

MongoDB显示每个用户每天的第一个和最后一个事件,mongodb,mongodb-query,Mongodb,Mongodb Query,每次用户登录或注销时,mongo中都会保存一个事件。用户每天可以多次登录和/或注销 例如,Bob登录2次,注销1次: { username: ‘bob’, type: ‘login’, eventDate: ISODate(‘2018-09-21T12:39:50.676Z’) } { username: ‘bob’, type: ‘login’, eventDate: ISODate(‘2018-09-21T13:55:50.676Z’) } { usernam

每次用户登录或注销时,mongo中都会保存一个事件。用户每天可以多次登录和/或注销

例如,Bob登录2次,注销1次:

{
  username: ‘bob’,
  type: ‘login’,
  eventDate: ISODate(‘2018-09-21T12:39:50.676Z’)
}

{
  username: ‘bob’,
  type: ‘login’,
  eventDate: ISODate(‘2018-09-21T13:55:50.676Z’)
}

{
  username: ‘bob’,
  type: ‘logout,
  eventDate: ISODate(‘2018-09-21T22:10:50.676Z’)
}
James只有一个登录事件:

{
  username: ‘james’,
  type: ‘login,
  eventDate: ISODate(‘2018-09-21T10:10:50.676Z’)
}
我想执行一个查询,检索每个用户每天的当天第一次登录和当天最后一次注销(比如在过去一周内)

因此,结果将是:

[{
  username: ‘bob’,
  firstLogin: ISODate(‘2018-09-21T12:39:50.676Z’),
  lastLogout: ISODate(‘2018-09-21T22:10:50.676Z’)
}

{
  username: ‘james’,
  firstLogin: ISODate(‘2018-09-22T10:19:50.676Z’),
  lastLogout: null,
}]

我相信我必须处理“聚合”,但不确定。

使用两个级别的
$group
:(MongoDB V3.2.18)

我相信用户名是独一无二的

  • $sort
    eventDate首先
  • $group
    用户名和键入
  • $project
    来区分第一次登录最后登录
  • $group
    再次使用用户名查看最终结果

  • 输出:

    /* 1 */
    {
        "_id" : "james",
        "firstLogin" : ISODate("2018-09-21T10:10:50.676Z"),
        "lastLogout" : null
    }
    
    /* 2 */
    {
        "_id" : "bob",
        "firstLogin" : ISODate("2018-09-21T12:39:50.676Z"),
        "lastLogout" : ISODate("2018-09-21T22:10:50.676Z")
    }
    

    通过使用两个级别的
    $group
    :(MongoDB V3.2.18)

    我相信用户名是独一无二的

  • $sort
    eventDate首先
  • $group
    用户名和键入
  • $project
    来区分第一次登录最后登录
  • $group
    再次使用用户名查看最终结果

  • 输出:

    /* 1 */
    {
        "_id" : "james",
        "firstLogin" : ISODate("2018-09-21T10:10:50.676Z"),
        "lastLogout" : null
    }
    
    /* 2 */
    {
        "_id" : "bob",
        "firstLogin" : ISODate("2018-09-21T12:39:50.676Z"),
        "lastLogout" : ISODate("2018-09-21T22:10:50.676Z")
    }
    

    您可以通过单个
    来实现

    当同一用户有不同的工作日时也可以工作

    通过
    键入
    返回上一个和第一个日期

    在MongoDB GUI上测试


    您可以通过单个
    来实现

    当同一用户有不同的工作日时也可以工作

    通过
    键入
    返回上一个和第一个日期

    在MongoDB GUI上测试


    您应该使用
    $max
    查找上次注销的值。是的,谢谢。由mistak提供。您应该使用
    $max
    查找上次注销的值。是的,谢谢。这是错的。
    db.getCollection("loginDetail").aggregate([
      {
        $group: {
          _id: {
            username: "$username",
            year: { $year: "$eventDate" },
            month: { $month: "$eventDate" },
            day: { $dayOfMonth: "$eventDate" }
          },
          firstLogin: {
            $min: {
              $cond: [{ $and: [{ $eq: ["$type", "login"] }] }, "$eventDate", null]
            }
          },
          lastLogout: {
            $max: {
              $cond: [{ $and: [{ $eq: ["$type", "logout"] }] }, "$eventDate", null]
            }
          }
        }
      },
      {
          $project: {
              _id: 1,
              username : '$_id.username',
              firstLogin :1,
              lastLogout :1
              }
          }
    ]);