0

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.

1 Answer 1

1

$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":[]}})
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.