Morteza
Morteza

Reputation: 191

Mongodb $lookup with condition in aggregate query

I have a collection called article_parent with documents like this:

    { "name": "name1", "group": 1 }
    { "name": "name2", "group": 1 }
    { "name": "name3", "group": 2 }
    { "name": "name4", "group": 3 }
    { "name": "name5", "group": 2 }

and I have other collection called article which store all my post

    {"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"}

I Want to get all articles that article_parent.group is 2 like this

    {"parent_name": "name3", "value": "val3", parent: { "name": "name3", "group": 2 }}
    {"parent_name": "name5", "value": "val5", parent: { "name": "name5", "group": 2 }}

I have this query :

db.article.aggregate([{
    $lookup: {
        from: "article_parent",
        let: {
            name: "$parent_name"
        },
        pipeline: [
            { $match: { group: 2 } }
         ],
        as: "parent"}}
    ])

but the query not found any article

Where is my query wrong?

What can I do?

Thanks

Upvotes: 1

Views: 219

Answers (1)

varman
varman

Reputation: 8894

What you have tried is appreciated. You tried to use uncorrelated-sub-queries. So when you use a variable inside pipeline which you defined inside let, you need to use $expr. The problem you have done was, you didn't join both collections by one particular field.

[
  {
    $lookup: {
      from: "article_parent",
      let: {
        pname: "$parent_name"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $eq: [
                "$name",
                "$$pname"
              ]
            },
            group: 2
          }
        }
      ],
      as: "parent"
    }
  },
  {
    $match: {
      parent: {
        $ne: []
      }
    }
  }
]

Working Mongo playground

Upvotes: 1

Related Questions