Как использовать $ text search внутри $ lookup pipe - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть следующая коллекция для примера:

// vehicles collection

[
  {
    "_id": 321,
    manufactor: SOME-OBJECT-ID
  },
  {
    "_id": 123,
    manufactor: ANOTHER-OBJECT-ID
  },
]

И у меня есть коллекция именованных таблиц:

// tables collection
[
  {
    "_id": SOME-OBJECT-ID,
    title: "Skoda"
  },
  {
    "_id": ANOTHER-OBJECT-ID,
    title: "Mercedes"
  },
]

Как вы можете видеть, документы коллекции транспортных средств извлекают данные изколлекционные столы таблиц - первый документ в коллекции автомобилей имеет идентификатор производителя, который извлекается из коллекции таблиц и называется Skoda.

Это здорово.

Когда я запрашиваю базу данныхиспользуя агрегат, я могу легко извлечь удаленные данные из удаленных коллекций соответственно - без каких-либо проблем.Я также могу легко создавать правила и ограничения, такие как $ project, $ sort, $ skip, $ limit и др.

Но я хочу показать пользователю только те автомобили, которые производятся Mercedes.Поскольку Mercedes не упоминается в коллекции автомобилей, а указывается только его идентификатор, поиск $ text $ не вернется с правильными результатами.

Это сводный конвейер, который я предоставляю:

[
  {
    $match: {
      $text: {
        $search: "Mercedes"
      }
    }
  },
  {
    $lookup: {
      from: "tables",
      let: {
        manufactor: "$manufactor"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $eq: [
                "$_id", "$$manufactor"
              ]
            }
          }
        },
        {
          $project: {
            title: 1
          }
        }
      ],
      as: "manufactor"
    },
  },
  {
    $unwind: "$manufactor"
  },
  {
    $lookup: {
      from: "tables",
      let: {
        model: "$model"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $eq: [
                "$_id", "$$model"
              ]
            }
          }
        },
        {
          $project: {
            title: 1
          }
        }
      ],
      as: "model"
    },
  },
  {
    $unwind: "$model"
  },
  {
    $lookup: {
      from: "users",
      let: {
        joined_by: "$_joined_by"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $eq: [
                "$_id", "$$joined_by"
              ]
            }
          }
        },
        {
          $project: {
            personal_info: 1
          }
        }
      ],
      as: "joined_by"
    },
  },
  {
    $unwind: "$joined_by"
  }
]

Как вы можете видеть, я использую $ text и $ search $ match на первом этапе в конвейере - в противном случае MongoDB выдаст ошибку.

Но этот объект поиска $ text $ ищется только в источникеcollection - коллекция транспортных средств.

Есть ли способ указать MongoDB выполнить поиск в удаленной коллекции с помощью метода $ text и $ search и затем включить в сводные результаты только те результаты, которые соответствуют обоим?

ОБНОВЛЕНИЕ

Когда я делаю это вместо этого:

     {
      $lookup: {
        from: "tables",
        pipeline: [
          {
            $match: {
              $text: {
                $search: "Mercedes"
              }
            }
          },
          {
            $project: {
              title: 1
            }
          }
        ],
        as: "manufactor"
      },
    },

Вот что я получаю:

 MongoError: pipeline requires text score metadata, but there is no text score available
...