Fohlen
Fohlen

Reputation: 296

Find empty documents in a database

I have queried an API which is quiet inconsistent and therefore does not return objects for all numerical indexes (but most of them). To further go on with .count() on the numerical index I've been inserting empty documents with db.collection.insert({})

My question now is: how would I find and count these objects? Something like db.collection.count({}) won't work obviously.

Thanks for any idea!

Upvotes: 1

Views: 2363

Answers (2)

chridam
chridam

Reputation: 103335

For MongoDB 3.4.4 and newer, consider running the following aggregate pipeline which uses $objectToArray (which is available from MongoDB 3.4.4 and newer versions) to get the count of those empty documents/null fields:

db.collection.aggregate([
    { "$project": {
        "hashmaps": { "$objectToArray": "$$ROOT" } 
    } }, 
    { "$project": {
        "keys": "$hashmaps.k"
    } },
    { "$group": {
        "_id": null,
        "count": { "$sum": {
            "$cond": [
                {
                    "$eq":[
                        {
                            "$ifNull": [
                                { "$arrayElemAt": ["$keys", 1] },
                                0
                            ]
                        },
                        0
                    ]
                },
                1,
                0
            ]
        } }
    } }
]); 

Upvotes: 0

Lex
Lex

Reputation: 184

Use the $where operator. The Javascript expression returns only documents containing a single key. (that single key being the documents "_id" key)

db.collection.find({ "$where": "return Object.keys(this).length == 1" }).count()

Upvotes: 1

Related Questions