汇总:嵌套文档(嵌套对象)中的分组日期

时间:2020-04-20 13:21:35

标签: mongodb aggregation-framework

我有一个包含用户信息的mongo数据库。如果添加了 new userdata ,我将进行重复检查,如果条目重复,则不会创建新文档,而是使用嵌套节点(处于跟踪状态)更新现有文档,并添加时间戳记和其他一些信息。

{
  "_id": "5e95dee277dcc55e9d18bf1a",
  "email": "test@test.com",
  "tracking": [
    {
      "domain": "mydomain",
      "subdomain": "",
      "ip": "59.214.120.68",
      "timestamp": "2020-03-21 20:06:12",
      "externalID": "82"
    },
    {
      "domain": "mydomain",
      "subdomain": "",
      "ip": "99.214.130.33",
      "timestamp": "2020-03-26 18:43:01",
      "externalID": "483"
    },
    {
      "domain": "mydomain",
      "subdomain": "",
      "ip": "19.214.131.22",
      "timestamp": "2020-03-26 18:48:42",
      "externalID": "485"
    }
  ]
}

现在,我正在尝试汇总文档并按日期对它们进行分组/计数。对于每个文档, tracking 下的节点数不同,我有什么选择办法?

2 个答案:

答案 0 :(得分:0)

您可以执行以下操作。

{
    $unwind: {
        path: "$tracking",
        preserveNullAndEmptyArrays: true
    }
}, {
    $group: {
        _id: "$tracking.timestamp",
        count: {
            $sum: 1
        }
    }
}

答案 1 :(得分:0)

如果您可以将日期时间存储为实际的日期时间类型而不是字符串表示形式,那就更好了。但是假设您暂时不能,将日期部分归为没有时间(这是我认为您要寻找的),则可以使用substr

db.foo.aggregate([
{$unwind: "$tracking"}
,{$group: {"_id": {$substr: [ "$tracking.timestamp", 0, 10] } , n: {$sum:1} }}
]);