Агрегирование: групповая дата во вложенных документах (вложенный объект) - PullRequest
2 голосов
/ 20 апреля 2020

У меня база данных mon go с информацией о пользователе. Если добавлено новые пользовательские данные , я делаю повторную проверку, и в случае дублированной записи я не создаю новый документ, а вместо этого обновляю существующий вложенным узлом (под отслеживанием), добавляя отметку времени и некоторая другая информация.

{
  "_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"
    }
  ]
}

Теперь я пытаюсь объединить документы и сгруппировать / подсчитать их по дате. Есть ли вариант, как я могу сделать это с различным числом узлов в отслеживания для каждого документа?

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

Было бы намного лучше, если бы вы могли хранить datetime как фактический тип datetime, а не как строковые представления. Но предполагая, что пока вы не можете сгруппировать по компоненту даты без времени (именно это, я полагаю, вы ищете), вы можете использовать substr:

db.foo.aggregate([
{$unwind: "$tracking"}
,{$group: {"_id": {$substr: [ "$tracking.timestamp", 0, 10] } , n: {$sum:1} }}
]);
0 голосов
/ 20 апреля 2020

Вы можете сделать что-то вроде этого.

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