Node.js 将数据批量更新到mongodb中

Node.js 将数据批量更新到mongodb中,node.js,mongodb,express,mongoose,mongodb-query,Node.js,Mongodb,Express,Mongoose,Mongodb Query,我的数据库中存储了以下数据 [ { date:'1-1-2016', users:[ { 'name':'james', 'age':18 }, { 'name':'alice', 'age':20 } ] },

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

[
    {
        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岁


但如何批量更新,说一个日期范围是给定的?是否将循环用于上述查询?我认为这是没有效率的。需要指导。

您可以使用
$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);
var data=[{“name”:“james”,“age”:10},{“name”:“alice”,“age”:11}];
var查询=[];
对于(变量i=0;i
您可以使用
$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);
var data=[{“name”:“james”,“age”:10},{“name”:“alice”,“age”:11}];
var查询=[];
对于(变量i=0;i
如果在2016年1月1日,我想将詹姆斯的年龄设置为10岁,在2016年2月1日,我想将詹姆斯的年龄设置为11岁,依此类推,该怎么办?不是日期范围对不起,我错过了。这是几个不同日期的批量更新数据。我使用
bulkWrite
进行了更新,以基于动态配置名称/age执行多个
updateMany
。这正是我之前所做的。但您的逻辑有缺陷,如果用户选择1-1-2016、4-1-2016和1-2-2016会怎么样?如果2016年1月1日我想将詹姆斯的年龄设置为10岁,2016年2月1日我想将詹姆斯的年龄设置为11岁,依此类推?不是日期范围对不起,我错过了。这是几个不同日期的批量更新数据。我使用
bulkWrite
进行了更新,以基于动态配置名称/age执行多个
updateMany
。这正是我之前所做的。但您的逻辑有缺陷,如果用户选择1-1-2016、4-1-2016和1-2-2016怎么办?