2

select name, age from table1 where name in (select name from table1 where age > 20)

How to convert above sql subquery to mongo aggregation pipeline?

Marika
  • 31
  • 1
  • 4

1 Answers1

1

Given the following sample data:

db.collection.insert([
    { "name": "Peter", "age": 1 },
    { "name": "Peter", "age": 10 },
    { "name": "Peter", "age": 100 },
    { "name": "Paul", "age": 1 },
    { "name": "Mary", "age": 100 },
])

What you can do is this:

db.collection.aggregate({
    $group: {
        "_id": "$name", // group by name
        "docs": { $push: "$$ROOT" } // push all found documents into an array per group
    }
}, {
    $match: {
        "docs.age": { $gt: 5 } // eliminate all records that do not have at least one "age" entry that's greater than 5
    }
}, {
    $unwind: "$docs" // flatten the group structure into multiple documents again
}, {
    $replaceRoot: {
        "newRoot": "$docs" // restore original document layout
    }
})

...which will yield:

/* 1 */
{
    "_id" : ObjectId("59df15f9ad526e347ed9cda0"),
    "name" : "Mary",
    "age" : 100.0
}

/* 2 */
{
    "_id" : ObjectId("59df15f9ad526e347ed9cd9c"),
    "name" : "Peter",
    "age" : 1.0
}

/* 3 */
{
    "_id" : ObjectId("59df15f9ad526e347ed9cd9d"),
    "name" : "Peter",
    "age" : 10.0
}

/* 4 */
{
    "_id" : ObjectId("59df15f9ad526e347ed9cd9e"),
    "name" : "Peter",
    "age" : 100.0
}
dnickless
  • 10,733
  • 1
  • 19
  • 34