Nately Jamerson
Nately Jamerson

Reputation: 313

bulk update data into mongodb

I have below data in stored in my db.

[
    {
        date:'1-1-2016',
        users:[
            {
                'name':'james',
                'age':18
            },
            {
                'name':'alice',
                'age':20
            }
        ]
    },
    {
        date:'2-1-2016',
        users:[
            {
                'name':'james',
                'age':18
            },
            {
                'name':'alice',
                'age':20
            },
            {
                'name':'xiaomi',
                'age':29
            }
        ]
    }
]

I have a challenge to bulk update array of object efficiently.

My initial solution to update on single collection is

Users.update({date:'1-1-2016','user.name':'james'},{'$set':'users.$.age':5}})

So this will update james's age to 5 from 18, base on date and user's name.

But how to bulk update, says a range of date is given? use loop with above query? I think it's not efficient. Need guidance.

Upvotes: 0

Views: 74

Answers (1)

Bertrand Martel
Bertrand Martel

Reputation: 45352

You can use $gte/$gt and $lte/$lt to match a date range:

db.users.update({
    date: {
        $gte: '1-1-2016',
        $lt: '31-1-2016'
    },
    'users.name': 'james'
}, { '$set': { 'users.$.age': 10 } }, { 'multi': true })

To bulk update with many couple of conditions name/age :

var data = [{ "name": "james", "age": 10 }, { "name": "alice", "age": 11 }];

var query = [];

for (var i = 0; i < data.length; i++) {

    query.push({
        updateMany: {
            "filter": {
                date: {
                    $gte: '1-1-2016',
                    $lt: '31-1-2016'
                },
                'users.name': data[i].name
            },
            "update": { '$set': { 'users.$.age': data[i].age } }
        }
    })
}

db.users.bulkWrite(query);

Upvotes: 2

Related Questions