Поиск Mongo с заполнением в конвейере агрегации с текстовым индексом

У меня есть один вопрос относительно реализации поиска. Здесь лучше всего подходит реализация поиска или атлас-поиска для поиска в отдельной коллекции. Я думаю, что обычно мы сталкивались со сценарием, в котором нам также нужно искать с помощью коллекции populate или ref. Как это сделать с лучшей реализацией?

Рассмотрим очень простой сценарий, в котором у меня есть 2 коллекции.

1 Продукт (текстовый индекс поля названия продукта)

2 Пользователь (текстовый индекс в полях имени пользователя может быть именем, фамилией и т. д.)

Пользователь создает продукты, поэтому в коллекции продуктов есть ссылка на createdBy с MongoID пользователя. Во внешнем интерфейсе есть список продуктов, поэтому мне нужно указать критерии поиска, как показано ниже, в одиночном текстовом поиске.

  1. Я могу искать по названию продукта
  2. Я могу искать по имени владельца продукта

Как лучше всего справиться с таким сценарием с помощью MongoAtlas? бывший. Я хочу все продукты, созданные Донни Бахханом. каков конвейер агрегации, который вы только что использовали, или лучшая практика для него

Я уже задавал вопрос сообществу MongoDB, но не получил надлежащей помощи, пожалуйста, просмотрите ссылку ниже для справки сообщества

https://developer.mongodb.com/community/forums/t/mongo-search-with-populate-in-aggregation-pipeline-with-text-index/6953


person Jaydipsinh Vaghela    schedule 22.07.2020    source источник


Ответы (1)


Лучше я объясню это как шаги

Шаг 1: сопоставьте с коллекциями пользователей: там вы получите информацию о пользователе.

Шаг 2: поиск в коллекциях продуктов: при этом вы получите все продукты, созданные пользователем.

Шаг 3: сопоставьте для поиска, если требуется какой-либо поиск или фильтр, чтобы сопоставить это с названием продукта.

пример: (Надеюсь, это может вам помочь)

    async function search(userid, query = null)
    {
      return await userModel
        .aggregate()
        .match({
          _id: userid
        })
        .lookup({
          from: "products",
          localField: "_id",
          foreignField: "userid",
          as: "products"
        })
        .match({ $text: { $search: "cake" }  })
        .exec();
    }
person BINFAS K    schedule 22.07.2020
comment
Да, это обходной путь, и я уже реализовал этот подход. Но это не идеальное решение для запроса таких вещей, учитывая, что у меня есть тысячи данных, и я использую этот запрос, тогда он немного излишен. - person Jaydipsinh Vaghela; 22.07.2020
comment
И, во-вторых, я не могу напрямую запрашивать модель пользователя, так как есть много других фильтров, которые мне нужно выполнить для модели продукта. есть и другие пути к этому. - person Jaydipsinh Vaghela; 22.07.2020
comment
Я думаю, что тогда лучший метод - вам нужно выполнить все фильтры в коллекции продуктов с идентификатором пользователя, а затем только lookup или populate данные пользователя. - person BINFAS K; 22.07.2020
comment
Для текстового поиска нет механизма для идентификации того, что пользователь ищет название продукта или имя или фамилию пользователя. Мы не можем этого сделать. пожалуйста, внимательно ознакомьтесь с деталями, чтобы получить правильное представление. какой именно случай - person Jaydipsinh Vaghela; 22.07.2020