简体   繁体   中英

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.

$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":[]}})

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM