mo_maat
mo_maat

Reputation: 2240

Mongodb query to find element value type of nested array or object in a field

I have mongodb data model where I have some array fields that contain embedded objects or arrays. I have some inconsistencies in the field in question because I've tweaked my application logic. Initially, my model looked like this:

Initial Setup of Results collection

"competition" : "competition1",
"stats" : [ 
    {
        "stat1" : [],
        "stat2" : []
    }
]

However, I saw that this wasn't the best setup for my needs. So I changed it to the following:

New Setup of Results collection

"competition" : "competition1",
"stats" : [ 
    {
        "stat1" : 3,
        "stat2" : 2
    }
 ]

My problem now is that documents that have the initial setup cause an error. So what I want is to find all documents that have the initial setup and convert them to have the new setup.

How can I accomplish this in mongodb?

Here is what I've tried, but I'm stuck...

db.getCollection('results').find({"stats.0": { "$exists": true }})

But what I want is to be able to do something like

db.getCollection('results').find({"stats.0".stat1: { "$type": Array}})

Basically I want to get documents where the value of stats[0].stat1 is of type array and override the entire stats field to be an empty array.

This would fix the errors I'm getting.

Upvotes: 0

Views: 85

Answers (1)

s7vr
s7vr

Reputation: 75964

$type operator for arrays in older versions works little differently than what you might think than $type in 3.6.

This will work in 3.6

db.getCollection('results').find( { "stats.0.stat1" : { $type: "array" } } )

You can do it couple of ways for lower versions and It depends what you are looking for.

For empty arrays you can just check

{"stats.0.stat1":{$size:0}}

For non empty arrays

{"stats.0.stat1": {$elemMatch:{ "$exists": true }}}

Combine both using $or for finding both empty and non empty array.

For your use case you can use below update

db.getCollection('results').update({"stats.0.stat1":{$size:0}}, {$set:{"stats":[]}})

Upvotes: 1

Related Questions