MongoDB: значение соответствия для внешней коллекции

#mongodb #mongodb-query

#mongodb #mongodb-запрос

Вопрос:

У меня есть ПОЛЬЗОВАТЕЛЬ коллекции:

 {
    "_id" : ObjectId("5d64d2bf48dd17387d77d27a"),
    "name" : "John",
    "notifications" : {
        "email" : false,
        "sms" : true
    }
},
{
    "_id" : ObjectId("5da9586911e192081ee1c6be"),
    "name" : "Mary",
    "notifications" : {
        "email" : false,
        "sms" : false
    }
}
 

И это другое ПРЕДУПРЕЖДЕНИЕ о коллекции:

 {
    "_id" : ObjectId("5d54f04dbe5e6275e53a551e"),
    "active" : true,
    "user_id" : ObjectId("5d64d2bf48dd17387d77d27a")
},
{
    "_id" : ObjectId("5d54f04dbe5e6275e53a551f"),
    "active" : false,
    "user_id" : ObjectId("5d64d2bf48dd17387d77d27a")
},
{
    "_id" : ObjectId("5d54f04dbe5e6275e53a552e"),
    "active" : true,
    "user_id" : ObjectId("5da9586911e192081ee1c6be")
},
{
    "_id" : ObjectId("5d54f04dbe5e6275e53a552f"),
    "active" : true,
    "user_id" : ObjectId("5da9586911e192081ee1c6be")
}
 

Я хочу запрос MongoDB, в котором перечислены документы в предупреждении о сборе, свойство «active» которых равно TRUE, и соответствующий ПОЛЬЗОВАТЕЛЬ которого также имеет элемент «sms» в свойстве «уведомления» как TRUE.

Ответ №1:

Вы можете использовать нескоррелированные подзапросы в $lookup

  • $match чтобы получить "notifications.sms": true
  • $lookup для объединения двух коллекций. Мы присваиваем uId = _id значение из коллекции ПОЛЬЗОВАТЕЛЕЙ. Внутри pipeline , мы используем $match , чтобы найти active :true , и _id=uId

вот сценарий

 db.USER.aggregate([
  {
    "$match": {
      "notifications.sms": true
    }
  },
  {
    "$lookup": {
      "from": "ALERT",
      "let": {
        uId: "$_id"
      },
      "pipeline": [
        {
          $match: {
            $and: [
              {
                active: true
              },
              {
                $expr: {
                  $eq: [
                    "$user_id",
                    "$uId"
                  ]
                }
              }
            ]
          }
        }
      ],
      "as": "joinAlert"
    }
  }
])
 

Рабочая игровая площадка Mongo