计算所有用户的登录次数

时间:2015-12-07 15:02:30

标签: arrays mongodb count find

我一直在查看Mongo文档,但似乎无法弄清楚如何执行以下操作。

我的mongoDB中有许多用户文档。我还存储他们登录的时间。我的文件的基本结构如下:

{
  "_id": "5649d78a3701a14f0da852d1",
  "email": "email@domain.com",
  "logins": [
  {
    "_id": "56585cd2d869365ba532cfdd",
    "logintime": "2015-11-27T15:54:19.000Z",
    "typelogin": "website"
  },
  {
    "_id": "56585cfaa52ebe65a58d2feb",
    "logintime": "2015-11-27T15:54:19.000Z",
    "typelogin": "website"
  ]}
}

正如您所看到的,每次用户登录时,我都会将其存储在数组"登录"。

我想要做的是计算特定日期之后所有登录的出现次数。例如,截至昨天的所有登录。

当我跑步时:

db.find({ "logins.logintime": { "$gte": new Date("2015-11-07T00:00:00.000Z")}},{ _id: 0, logins: {$elemMatch: { "typelogin": "website"}}});

我只收到一份文件。这是不正确的,因为有更多登录,但find只返回一个文档。我想我必须聚合并将结果推送到一个新数组中,但我不确定如何做到这一点。

1 个答案:

答案 0 :(得分:1)

您可以使用聚合,如下所示:

  • 第1步:展开登录
  • 第2步:匹配登录
  • 第3步:分组和计数

    db.dbname.aggregate([
        {$unwind: "$logins"},
        {$match: {
            "logins.logintime": {$gte: "2015-11-27T15:54:19.000Z"}, 
            "logins.typelogin": "website"
        }},
        {$group: {
            _id: "$email", 
            logins: {$sum: 1}
        }}
    ])
    

这将使用上面的示例数据返回:

{ "_id" : "email@domain.com", "logins" : 2 }