Maxim Zabolotskikh
Maxim Zabolotskikh

Reputation: 3367

Query on all descendants of node

Given a collection of MongoDb documents with a property "myContacts" like this:

  {
       "_id": 123,
       "myContacts" : {            
            "contacts" : {
                "10" : {
                    "_id" : NumberLong(10),
                    "name" : "c1",
                    "prop" : true
                },
                "20" : {
                    "_id" : NumberLong(20),
                    "name" : "c2"
                },
            }
        }
}

I want to select all documents, where at least one contact lacks the "prop" field. I figured out a general query:

db.getCollection('xyz').find({ 'myContacts.contacts.???.prop': { $exists: false } })

The problem is that IDs of the contacts are part of the path and I cannot know them ahead. I want sth like 'myContacts.contacts.$anyChild.prop', but cannot find sth similar in the mongo docs.

Does it mean there is no way to do it?

PS: I cannot change the document structure, a live app uses it. I've spent some time with Google and my bet it's not possible. I however would like an opinion from people who have experience with Mongo.

Upvotes: 1

Views: 99

Answers (1)

Maxim Zabolotskikh
Maxim Zabolotskikh

Reputation: 3367

Thank you guys for helpful comments, this got me going! I could get the results I wanted with:

db.getCollection('xyz').aggregate([{$project: {_id:1, contacts:{$objectToArray: "$myContacts.contacts"}}}, {$match: {"contacts.v.prop" : null}}])

Upvotes: 1

Related Questions