mongodb 内嵌数组 批量修改问题

浏览:41日期:2023-06-25

问题描述

对于一个文档结构为:

{ '_id' : ObjectId('57133995fb5f8930d0e9b81a'), 'taskList' : [{ 'taskId' : NumberLong(1), 'state' : 'ST00', 'createTime' : ISODate('2016-04-17T07:21:58.424Z') },{ 'taskId' : NumberLong(2), 'state' : 'ST00', 'createTime' : ISODate('2016-04-17T07:21:58.424Z') },{ 'taskId' : NumberLong(3), 'state' : 'ST00', 'createTime' : ISODate('2016-04-17T07:21:58.424Z') }]}

taskList 长度不确定

如何批量对数组内容进行修改呢?

例如批量修改 '_id' : ObjectId('57133995fb5f8930d0e9b81a') 的 taskList 内嵌元素 的 state 字段 为 ’ST02’

@Mongoing中文社区

问题解答

回答1:

MongoDB 的update语句一次只能更新数组中匹配的第一个元素。几个思路:

1) 重新建模,把tasklist 放到另外一个表里,然后用reference来引用。如果你这种需求很多

2) 先做一次查询得到taskList的length,然后根据这个length拼update语句:

var length = db.test.aggregate([{$project:{lenOfArray: {$size:'$taskList'}}}]).next().lenOfArray;var updateObj = {};for(var i=0;i<length;i++){ updateObj['taskList.'+ i+'.stat'] = 'ST02';}db.test.update({ }, {$set: updateObj } );

回答2:

怎么把大象放进冰箱里? 开门 放进去 关门一样的 拿到这条数据 自己遍历这个数组修改 存这条数据~一般来说是这样的

回答3:

Mongodb目前尚不支持内嵌数据的批量修改,现在只有一条一条的取update,不过可以写一段JS方法去封装下

回答4:

同上,采用js方法对每个doc进行修改后save,代码示例如下,题主需要自己测试下(在mongo shell中执行)

changeState = function(doc){ taskList = doc.taskList; for(var i in taskList){taskList[i].state = ’ST02’; } db.test.save(doc)} db.test.find({'_id' : ObjectId('57133995fb5f8930d0e9b81a')}).forEach(changeState)

相关文章: