Как упорядочить документы по количеству элементов в массиве, которые соответствуют запросу? - PullRequest
0 голосов
/ 18 июня 2019

У меня есть коллекция в Монго, в которой каждый документ содержит массив временных отметок, и мне нужно найти (объединить) документы с наибольшим количеством временных отметок за данный период времени.

Я знаю, что мне нужно использовать $ aggregate, но мне сложно понять, как отфильтровать и подсчитать количество элементов в массиве.

Пример документа выглядит так:

{
"_id" : "en.m.wikipedia.org",
"times" : [
    ISODate("2019-06-03T14:19:33.405Z"),
    ISODate("2019-06-03T14:19:52.394Z"),
    ISODate("2019-06-03T14:29:15.474Z"),
    ISODate("2019-06-03T14:29:30.768Z"),
    ISODate("2019-06-03T14:30:25.578Z"),
    ISODate("2019-06-03T15:00:22.493Z"),
    ISODate("2019-06-03T15:05:03.759Z"),
    ISODate("2019-06-03T15:18:05.677Z"),
    ISODate("2019-06-03T15:38:22.771Z"),
    ISODate("2019-06-03T15:44:51.025Z"),
    ISODate("2019-06-03T15:45:15.336Z"),
    ISODate("2019-06-03T15:49:06.227Z"),
    ISODate("2019-06-03T17:10:19.396Z"),
    ISODate("2019-06-03T18:02:37.093Z"),
    ISODate("2019-06-03T18:39:29.812Z"),
    ISODate("2019-06-03T19:06:49.310Z"),
    ISODate("2019-06-03T19:46:52.381Z"),
    ISODate("2019-06-03T20:16:45.675Z"),
],
"source" : ["Admin"]
}

Идеальный результат будет примерно таким: счет будет отображать только количество временных отметок за данный период времени:

[
    {_id: "en.m.wikipedia.org", count: 12},
    {_id: "facebook.com", count: 7},
    etc...
]

1 Ответ

0 голосов
/ 25 июня 2019

Насколько я понимаю,

Я разработал следующее решение,

db.wikidata.aggregate([
    {
        $unwind: "$times"
    },
    {
        $match: {
            "times": {
                $gte: ISODate("2019-06-03T14:30:25.578Z"),
                $lte: ISODate("2019-06-03T19:46:52.381Z")
            }
        }
    },
    {
        $group: {
            "_id": "$_id",
            "count": {
                $sum: 1
            }
        }
    }
])

Выход:

{ "_id" : "en.m.wikipedia.org", "count" : 13 }

Теперь позвольте мне объяснить запрос на монго,

{
        $unwind: "$times"
}

Это создает документ, соответствующий каждому значению в массиве "times". Это будет использовано для сопоставления наших документов в заданном временном окне.

{
        $match: {
            "times": {
                $gte: ISODate("2019-06-03T14:30:25.578Z"),
                $lte: ISODate("2019-06-03T19:46:52.381Z")
            }
        }
}

Приведенное выше условие фильтрует документы на основе заданного временного окна. Вы можете генерировать даты ISO в javascript и обновлять их, чтобы установить собственный предел.

{
        $group: {
            "_id": "$_id",
            "count": {
                $sum: 1
            }
        }
}

Это группирует ваши документы на основе поля "id".

Примечание: Я использовал произвольное имя для коллекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...