Я использую MongoDB и Mongoose для создания веб-сайта, на котором есть компании и обзоры. В обзорах есть текстовый индекс, чтобы пользователи могли искать компании по тексту в соответствующих обзорах.
Результаты должны быть упорядочены по средней $ meta: "textScore".
Они также должны сопровождаться фрагментом обзора с наибольшим значением $ meta: "textScore".
Проблема возникает во второй части поиска: у некоторых предприятий нет подходящих отзывов.
Мой запрос структурирован следующим образом:
- Поиск в обзорах с $ text, группировка по бизнесу и сортировка по среднему значению textScore:
Review
.aggregate([
{ $match: { $text: { $search: query } } },
{ $group: { _id: "$businessId", avgScore: { $avg: { $meta: "textScore" } } } },
{ $sort: { avgScore: -1 } }
])
В обратном вызове для первого запроса я нахожу соответствующие предприятия:
Business
.find( { id: { $in: resultIds } } )
В последнем обратном вызове я ищу для каждого бизнеса наиболее подходящий отзыв:
Review.find({
businessId: business.id,
$text: { $search: query },
score: { $meta: "textScore" }
})
.sort( { score: { $meta: "textScore" } } )
.limit(1)
Первые два шага работают нормально. Последний шаг в основном работает, но иногда компании с самым низким рейтингом не имеют соответствующих отзывов.
Как предприятия, сгенерированные первоначальным поиском $ text, не могут вернуть результаты для последующего поиска $ text?
Редактировать: следующий вопрос Могу ли я достичьтот же запрос, используя Mongoose .populate ()? Я столкнулся с подобной проблемой с кодом ниже:
Business
.find({ _id: { $in: searchResults} })
.populate({
path: "reviews",
match: { $text: { $search: query } },
select: { score: { $meta: "textScore" } },
options: { sort: { score: { $meta: "textScore" } }, limit: 1 }
})