Mongodb $ поиск с условием в агрегированном запросе

#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: []
      }
    }
  }
]
  

Работает игровая площадка для Монго