MongoDB: сортировка по $ meta: «textScore» не возвращает результатов среди документов, сгенерированных из оригинального поиска $ text - PullRequest
1 голос
/ 30 октября 2019

Я использую MongoDB и Mongoose для создания веб-сайта, на котором есть компании и обзоры. В обзорах есть текстовый индекс, чтобы пользователи могли искать компании по тексту в соответствующих обзорах.

  1. Результаты должны быть упорядочены по средней $ meta: "textScore".

  2. Они также должны сопровождаться фрагментом обзора с наибольшим значением $ meta: "textScore".

Проблема возникает во второй части поиска: у некоторых предприятий нет подходящих отзывов.

Мой запрос структурирован следующим образом:

  1. Поиск в обзорах с $ 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 }
    })

1 Ответ

0 голосов
/ 30 октября 2019

При вызове find необходимо указать score: { $meta: "textScore" } в качестве отдельного параметра объекта проекции, а не включать его в объект запроса:

Review.find({ 
      businessId: business.id, 
      $text: { $search: query }      
    }, {
      score: { $meta: "textScore" }
    })
    .sort( { score: { $meta: "textScore" } } )
    .limit(1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...