поиск с аналогом LIKE в MongoDB - PullRequest
       5

поиск с аналогом LIKE в MongoDB

1 голос
/ 12 января 2020

У меня есть этот код в Postre sql, и я хочу написать то же самое в MongoDB:

SELECT
   u.full_name,
   u.phone_number,
   e.full_name,
   e.phone_number
FROM
   client u
   INNER JOIN employee e ON (
       u.phone_number LIKE '%22%'
       AND e.phone_number LIKE '%22%'
   );

Я знаю, что я могу использовать lookup в качестве эквивалента соединения, например:

db.client.aggregate({
$lookup:
    {
        from: "employee",
        localField: "client_id",
        foreignField : "_id",
        as: "result"
    }
})

и Как отдельно выглядит так:

db.client.find({phone_number: /55/})

Как я могу присоединиться и как эквиваленты вместе? Я хочу присоединиться к коллекциям при условии, что клиенты и сотрудник должны иметь, например, цифры 55 в своем поле phone_number // Upd: документы client коллекции выглядят так: client

name:'Thomas Smith',
    card_type:'Gold',
    card_term: new Date("2015-05-03"),
    gender:'male',
    password:'dsfsfds',
    phone_number:'494666027570'
    }
....

employee :

{
    name:'Patrick Manson',
    employee_datebirth: new Date("1986-05-08"),
    employment_start:'2014-12-06',
    gender:'male',
    paycheck:800,
    phone_number:'497185035712',
    position:'bodyweight-trainer'
    },{
....

1 Ответ

2 голосов
/ 12 января 2020

Другое допустимое решение: $regexMatch (v> = 4.2) или $regex оператор

db.client.aggregate([
  {
    $lookup: {
      from: "employee",
      let: {
        c_phone_number: "$phone_number"
      },
      pipeline: [
        {
          $addFields: {
            tmp: "$$c_phone_number"
          }
        },
        {
          $match: {
            phone_number: {
              $regex: ".*55.*"
            },
            tmp: {
              $regex: ".*55.*"
            }
          }
        },
        {
          $project: {
            tmp: 0
          }
        }
      ],
      as: "result"
    }
  },
  {
    $match: {
      "result.0": {
        $exists: true
      }
    }
  }
])

MongoPlayground

Примечание: Поскольку мы хотим inner join, но $lookup - это left outer join, нам нужно добавить дополнительное $match условие.

...