Поиск MongoDB Atlas по термину поиска в поле документа, в котором есть ссылка - PullRequest
1 голос
/ 20 июня 2020

Я знаю, как использовать поиск MongoDB Atlas для поиска заказов по его имени и заданному идентификатору покупателя вместе с известным / matched именем поставщика. Например:

( Использование Mon goose ODM)

    const searchResults = await Order.aggregate([
    {
      $search: {
        text: {
          query: '{search-term}',
          path: 'name',
          fuzzy: {
            maxEdits: 2,
            maxExpansions: 100,
          },
        },
      },
    },
    { $unwind: '$supplier' },
    {
      $lookup: {
        from: 'suppliers',
        localField: 'supplier',
        foreignField: '_id',
        as: 'suppliers',
      },
    },
    {
      $match: {
        buyer: mongoose.Types.ObjectId('5e19a594c86e72017debf9dc'),
        // The search term entered by a user:
        'suppliers.name': 'supplierName',
      },
    },
  ]);

Однако я хотел бы иметь возможность использовать поиск MongoDB Atlas для:

  • поиска всех заказов,
  • при Buyer ID,
  • , где поисковый запрос - не может быть полным соответствием - это Supplier name,
  • , где Покупатель и Поставщик вложены в Заказ по ссылочным идентификаторам:

Имея схему Order:

const orderSchema = new mongoose.Schema({
  name: {
    type: String,
    minlength: 2,
    maxlength: 255,
  },
  buyer: { type: ObjectId, ref: 'Buyer' },
  supplier: { type: ObjectId, ref: 'Supplier' },
});

Buyer схема:

const buyerSchema = new mongoose.Schema({
  name: {
    type: String,
  },
  ...
});

Supplier схема:

const supplierSchema = new mongoose.Schema({
  name: {
    type: String,
  },
  ...
});

Ответы [ 2 ]

1 голос
/ 02 июля 2020

Это должно работать с использованием составного , текста и равно в $search:

const order = await Order.aggregate([
{ $search: {
    compound: {
        must: [ 
            { text: { query: "SEARCH TERM", path: "name"}}, 
            { equals: { path: "buyer", value: ObjectId("5e19a594c86e72017debf9dc") }} 
        ]
    }
}}])

Вы также можете переместить равные запрос к предложению фильтра, если вы не хотите, чтобы он влиял на вашу оценку.

0 голосов
/ 21 июня 2020

Мне удалось достичь требуемого результата с помощью следующего, но он не использует поиск в Атласе, поэтому я был бы признателен за любую дополнительную помощь, как это сделать.

const order = await Order.aggregate([
      { $unwind: '$supplier' },
      {
        $lookup: {
          from: 'suppliers',
          localField: 'supplier',
          foreignField: '_id',
          as: 'suppliers',
        },
      },
      {
        $match: {
          buyer: mongoose.Types.ObjectId('5e19a594c86e72017debf9dc'),
          'suppliers.name': new RegExp('^' + supplierName, 'i'),
        },
      },
    ]);
...