Запуск 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, чтобы я мог правильно разбить результаты на страницы.
При использовании запросбудет выполнять сопоставление с полями, помеченными.
Есть ли лучший способ выполнить этот запрос в случае по умолчанию?Поможет ли индексирование дополнительных полей или размещение полей метаданных в качестве верхнего уровня?