Search code examples
mongodbaggregation

mongodb extract values from a double nested object


My data has this structure:

[
  {
    name: 'parent1',
    children:{
      child1:{ age:12, isSomething: true },
      child2:{ age:13, isSomething: false },
      child3:{ age:12, isSomething: true }
    }
  },
  {
    name: 'parent2',
    children:{
      child4:{ age:12, isSomething: true },
      child5:{ age:15, isSomething: false }
    }
  },
  ...
]

each document has a field children (object) containing all children for that parent, where for each element the key is the child name, and the value is an object containing that child's properties.

All children names across all documents are unique (child1, child2, ...)

Problem:

I want to query documents based on children properties, like for example: I want to get all documents that contain a child with age 15 => returns "parent2"

Is there some wildcard to cover for the diffrent keys in children, something like this:

find({"children.*.age":15})

Solution

  • You can use aggregation

    db.collection.aggregate([
      {
        $set: {
          obj: { "$objectToArray": "$children" }
        }
      },
      {
        $set: {
          obj: {
            "$filter": {
              "input": "$obj",
              "cond": {
                $gte: [ "$$this.v.age", 15 ]
              }
            }
          }
        }
      },
      {
        $match: {
          obj: { $ne: [] }
        }
      },
      {
        $project: {
          name: 1
        }
      }
    ])
    

    Working Mongo playground