Проблемы с агрегацией и группировкой MongoDB - PullRequest
0 голосов
/ 05 апреля 2019

Запуск MongoDB 4 на сервере Centos7 с 16 ГБ ОЗУ.Взаимодействие с Mongo через водителей pymongo.В настоящее время в коллекции интересов ~ 600 тыс. Документов.

Мои документы коллекции выглядят следующим образом:

{
    _metadata: {
        parent_name: <str_val>
        document_name: <str_val>
        datetime: <datetime object (indexed)>
        revision: <int>,
        first_name: <str>,
        last_name: <str>,
        other fields...
    }
    tag1: <val>
    tag2: <val>
    ...
}

Существует составной индекс (_metadata.document_name, _metadata.revision, _metadata.parent_name), который требует, чтобы комбинация была уникальной.

Я пытаюсь выполнить агрегированный запрос, сгруппированный по exam_id и revision, так, чтобы окончательные документы выглядели так:

{
    parent_name: <val>
    docu_revision_pairs: [[<revision>, <document_name>], ...]
    first_name: <val>
    last_name: <val>
    <other fields from _metadata>
 }

ИЯ хочу, чтобы документы были отсортированы по дате и времени.

Запущенный мной запрос:

[
        {
            "$match": {},
        },
        {
            "$sort": {
                "$_metadata.datetime": -1
            }
        },
        {
            "$group":
            {
                "_id": {"parent_name": "$_metadata.parent_name"},
                "revision": {"$push": "$_metadata.revision"},
                "document_name": {"$push": "$_metadata.document_name"},
                "first_name": {"$first": "$_metadata.first_name"},
                "last_name": {"$first": "$_metadata.last_name"},
                "datetime": {"$first": "$_metadata.datetime"},
                <other fields from _metadata>
            }
        },
        {
            "$project":
            {
                "docu_revision_pairs": {
                    "$zip": {
                        "inputs": ["$revision", "$document_name"]
                    }
                },
                "_id": 0,
                "parent_name": "$_id.parent_name",
                "first_name": 1,
                "last_name": 1,
                "datetime": 1,
                <other fields from _metadata>: 1
            }
        },
        {
            "$skip": page_size*(page_num - 1),
        },
        {
            "$limit": page_size,
        }
    ]

В настоящее время выполняется запрос «по умолчанию», который будет выполнять его для всей коллекции, ноЧтобы получить ответ, требуется ~ 10-15 секунд, и это прежде, чем я повторю аналогичный запрос, чтобы получить число файлов после этапа $ group, чтобы я мог правильно разбить результаты на страницы.

При использовании запросбудет выполнять сопоставление с полями, помеченными.

Есть ли лучший способ выполнить этот запрос в случае по умолчанию?Поможет ли индексирование дополнительных полей или размещение полей метаданных в качестве верхнего уровня?

1 Ответ

0 голосов
/ 06 апреля 2019

Возможно, это ускорится, если вы создадите индекс по metadata.datetime и отсортируете его так, как вам нужно в вашем запросе

...