У меня есть коллекция MongoDb, в которой хранятся данные о тысячах арендаторов, которые разделены полем, содержащим идентификатор арендатора.
Я хочу выполнить запрос, включающий полнотекстовый поиск и фасетирование для указанного c арендатора (см. ниже).
Поскольку $ searchBeta должен быть первой фазой в конвейере агрегации, это означает, что он вернет огромный список документов от всех арендаторов просто для того, чтобы отфильтровать их на фазе $ match вместо использования индекса.
Есть ли более эффективный способ выполнить такой запрос?
Выполнение его с помощью $ searchBeta занимает 14 секунд, а его удаление сокращает время запроса до 6 мс (в то время как фасетирование работает с большим количеством документов, поскольку включает в себя все данные арендатора).
* Используя приведенный ниже ответ Дуга, уменьшите его до ~ 70-120 мс.
* Измерение времени было выполнено на уровне без атласа, поэтому оно не значит слишком много
db.tenantData.aggregate( [
{
$searchBeta: {
"search": {
"query": "test",
"path": ["name","comment"],
}
}
},
{
$match: {tenant:"tenant1"},
},
{
$facet: {
"AssetTypeFacet": [
{ $sortByCount: "$assetType" }
],
"manufacturerFacet": [
{ $sortByCount: "$manufacturer" }
]
}
}
])