Я только недавно начал использовать MongoDB, пытаясь решить проблему c домена, и застрял при попытке самостоятельно присоединиться к большой коллекции. У меня есть база данных с более чем 10 миллионами документов, каждый из которых содержит элементы адреса для объекта (лицо, организация, почтовый ящик для организации и т. Д. c.). Обратите внимание, что каждая глубина (например, улица) может встречаться более одного раза для хранения различной информации, такой как псевдонимы или c идентификаторы глубины. У меня нет ограничений схемы, и я могу изменить ее, если это поможет решить вопрос.
Данные выглядят следующим образом:
{
"some_info": "xyz",
"tags": {
"HOUSE_NUMBER": [
{
"id": "23.45678",
"value": "18",
"attributes": ["NU"]
}
],
"FORENAME": [
{
"id": "34.56789",
"value": "MAX",
"attributes": ["XQ4", "M"]
},
{
"id": "45.67890",
"value": "X65732862",
"attributes": ["XID"]
}
],
"STREET": [
{
"id": "56.789012",
"value": "RICHMOND STREET",
"attributes": []
}
],
"...": []
}
}
Я хочу запросить пары в коллекции, например " найти все пары людей с одним и тем же именем, проживающих на одной улице », или« найти все пары лиц и организаций, имеющих не менее 3 общих слов, проживающих в одном городе ». Мой текущий запрос для первой проблемы выглядит примерно так:
db.collection_name.aggregate([
{$unwind: "$tags.STREET"},
{$unwind: "$tags.FORENAME"},
{
$match: {
"tags.FORENAME.attributes": {$nin: ["XID", "NA"]}
}
},
{
$lookup: {
from: "collection_name",
localField: "tags.STREET.id",
foreignField: "tags.STREET.id",
as: "joined"
}
},
{$unwind: "$joined"},
{$unwind: "$joined.tags.FORENAME"},
{
$match: {$expr: {$ne: ["$tags.FORENAME.id", "$joined.tags.FORENAME.id"]}}
},
{
$match: {$expr: {$eq: ["$tags.FORENAME.value", "$joined.tags.FORENAME.value"]}}
}
], {
allowDiskUse: true
})
Я создал индексы для tags.STREET.id, tags.FORENAME.id, tags.FORENAME.attributes и tags.FORENAME.value.
Проблема с этим во времени выполнения. Я просто не могу добраться до приемлемого уровня, вышеупомянутый запрос занимает 3,5 минуты для 500 результатов на моей машине. Для сравнения, моя база данных PostgreSQL (со специально созданными представлениями и индексами для проблемы) занимает всего несколько секунд.
Как я могу ускорить запросы такого типа? Подходит ли MongoDB для решения такого рода проблем?