#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