Как сделать совместный запрос таблицы в монго дБ? - PullRequest
0 голосов
/ 08 октября 2018

Я довольно новичок в mongodb, в прошлом я работал с mysql для запросов к базе данных.

Теперь у меня есть 2 коллекции mongo:

  1. companies
+--------------+--------------+
|    id        |     name     |
+--------------+--------------+
|     1        |   good name  |
+--------------+--------------+
|     2        |   bad name   |
+--------------+--------------+      
позиций
+--------------+---------------+-------------------+
|      id      |    companyId  |      name         |
+--------------+---------------+-------------------+
|      1       |      1        |     bad position  |
+--------------+---------------+-------------------+
|      2       |      2        |    good position  |
+--------------+---------------+-------------------+

Теперь мне нужно разрешить поиск позиций по нечеткому совпадению с названием, компанией или названием должности.Например, если я ищу по имени «хорошо», результат должен быть 2 позиции.Поскольку для позиции 1 это коррелированное название компании содержит «хорошо», а для позиции 2 ее собственное имя содержит «хорошо».

Так, как мне организовать aggregation pipelines для достижения этого?

Я пробовал следующее, но оно не работает:

const lookup = {
  from: "companies",
  localField: "companyId",
  foreignField: "_id",
  as: "companies"
};

const match = {
  $or: [
    {
      name: { $regex: companyOrPositionName }
    },
    {
      "companies": { name: { $regex: companyOrPositionName } }
    }
  ]
};

return await position.aggregate([{ $lookup: lookup }, { $match: match }]);

Кто-нибудь может помочь?Заранее спасибо!

1 Ответ

0 голосов
/ 08 октября 2018

Вы можете попробовать ниже агрегации

position.aggregate([
  { "$lookup": {
    "from": "companies",
    "let": { "companyId": "$_id" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": [ "$_id", "$$companyId" ] } } },
      { "$project": { "name": 1 }}
    ],
    "as": "companyName"
  }},
  { "$unwind": "$companyName" },
  { "$match": {
    "$or": [
      { "name": { "$regex": "good" }},
      { "companyName.name": { "$regex": "good" }}
    ]
  }}
])

или с помощью простых find запросов

const companies = await Companies.find({ "name": { "$regex": "good" }})
const ids = companies.map(company => company._id)

position.find({
  "$or": [
    { "companyId": { "$in": ids }},
    { "name": { "$regex": "good" }}
  ]
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...