【问题标题】:bulk update data into mongodb批量更新数据到 mongodb
【发布时间】:2017-05-13 08:20:02
【问题描述】:

我的数据库中存储了以下数据。

[
    {
        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
            }
        ]
    }
]

我在有效地批量更新对象数组方面遇到了挑战。

我对单个集合进行更新的初始解决方案是

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

所以这将根据日期和用户名将詹姆斯的年龄从 18 岁更新为 5 岁。

但是如何批量更新,说一个日期范围?对上述查询使用循环?我觉得效率不高。需要指导。

【问题讨论】:

    标签: node.js mongodb express mongoose mongodb-query


    【解决方案1】:

    您可以使用$gte/$gt$lte/$lt 来匹配日期范围:

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

    使用许多条件名称/年龄进行批量更新:

    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);
    

    【讨论】:

    • 如果我想在 2016 年 1 月 1 日将 james 的年龄设置为 10 岁,而在 2016 年 2 月 1 日我想将 james 的年龄设置为 11 岁等等?抱歉,这不是日期范围,我错过了解释。这是几个不同日期的批量更新数据。
    • 我已经更新了bulkWrite 以根据动态配置名称/年龄执行多个updateMany
    • 这正是我之前所做的。但是您的逻辑有缺陷,如果用户选择 1-1-2016、4-1-2016 和 1-2-2016 怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 2011-05-25
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    相关资源
    最近更新 更多