#mongodb #mongodb-query
#mongodb #mongodb-запрос
Вопрос:
У меня есть коллекция под названием article_parent
с такими документами:
{ "name": "name1", "group": 1 }
{ "name": "name2", "group": 1 }
{ "name": "name3", "group": 2 }
{ "name": "name4", "group": 3 }
{ "name": "name5", "group": 2 }
и у меня есть другая коллекция под названием article
, в которой хранятся все мои сообщения
{"parent_name": "name1", "value": "val1"}
{"parent_name": "name2", "value": "val2"}
{"parent_name": "name3", "value": "val3"}
{"parent_name": "name4", "value": "val4"}
{"parent_name": "name5", "value": "val5"}
Я хочу получить все статьи, article_parent.group
которых 2, как это
{"parent_name": "name3", "value": "val3", parent: { "name": "name3", "group": 2 }}
{"parent_name": "name5", "value": "val5", parent: { "name": "name5", "group": 2 }}
У меня есть этот запрос :
db.article.aggregate([{
$lookup: {
from: "article_parent",
let: {
name: "$parent_name"
},
pipeline: [
{ $match: { group: 2 } }
],
as: "parent"}}
])
но запрос не нашел ни одной статьи
Где мой запрос неверен?
Что я могу сделать?
Спасибо
Комментарии:
1. Итак, какое условие вам нужно для поиска
group=2
?. Например: присоединиться к таблице, когдаparent_name = name3
2. Я отредактировал свой вопрос, чтобы увидеть желаемый результат
Ответ №1:
То, что вы попробовали, оценено по достоинству. Вы пытались использовать некоррелированные подзапросы. Итак, когда вы используете переменную внутри конвейера, которую вы определили внутри let
, вам нужно использовать $expr. Проблема, с которой вы столкнулись, заключалась в том, что вы не объединили обе коллекции по одному конкретному полю.
[
{
$lookup: {
from: "article_parent",
let: {
pname: "$parent_name"
},
pipeline: [
{
$match: {
$expr: {
$eq: [
"$name",
"$$pname"
]
},
group: 2
}
}
],
as: "parent"
}
},
{
$match: {
parent: {
$ne: []
}
}
}
]
Работает игровая площадка для Монго