mongodb高级修改问题-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

mongodb高级修改问题

2016-06-29 10:17:15 2028 1

描述: 格式如下所示,其中每个对象有_id,name,和一个数组scores,其中可以看到修改前的数组中,每个document有两个type为"homework"的对象。
提问: 问题是如何操纵mongo数据库,批量修改db.students,让每个document中,删除score较小的homework,而保留score较大的homework。

修改前:

    "_id" : 100,
    "name" : "Demarcus Audette",
    "scores" : [
        {
            "score" : 47.42608580155614,
            "type" : "exam"
        },
        {
            "score" : 44.83416623719906,
            "type" : "quiz"
        },
        {
            "score" : 19.01726616178844,
            "type" : "homework"
        },
        {
            "score" : 39.01726616178844,
            "type" : "homework"
        }
    ]
}

修改后:

{
    "_id" : 100,
    "name" : "Demarcus Audette",
    "scores" : [
        {
            "score" : 47.42608580155614,
            "type" : "exam"
        },
        {
            "score" : 44.83416623719906,
            "type" : "quiz"
        },
        {
            "score" : 39.01726616178844,
            "type" : "homework"
        }
    ]
}

下面附上一段nodejs上跑的代码(自己写的,有问题跑不通,作为参考):

var MongoClient = require('mongodb').MongoClient;
MongoClient.connect('mongodb://localhost:27017/school', function(err, db){
    if(err) throw err;
    var query = {};
    var cursor = db.collection('students').find(query);
    cursor.each(function(err, doc){
        if(err)throw err;
        if(doc == null){return db.close();}

        /*TODO*/

        var target1 = doc.scores[2];
        var target2 = doc.scores[3];
        if(target1 < target2) doc.update({$unset: target1});
            else doc.update({$unset: target2});


        console.dir("Successfully found " + target1);
    });
});
取消 提交回答
全部回答(1)
  • a123456678
    2019-07-17 19:48:49
    var MongoClient = require('mongodb').MongoClient;
    
    MongoClient.connect('mongodb://school:school@localhost:27017/school', function(err, db) {
      if (err) {
        throw err;
      }
    
      var student = db.collection('students');
      var updateData = function(newdoc) {
        //把旧的删除
        student.findAndRemove({_id: newdoc._id}, function(err, olddoc) {
          if (err) {
            throw err;
          }
    
          olddoc && console.log('remove olddoc id: %s', olddoc._id);
    
          //插入新的
          student.insert(newdoc, function(err, saveResult) {
            if (err) {
              throw err;
            }
    
            saveResult && console.log('[OK]  update ok , id: %s', newdoc._id);
            saveResult || console.log('[ERR] update fail, id: %s', newdoc._id);
          });
    
        });
      };  
    
      //插入测试数据
      student.insert([
        {
          name: 'hehehe',
          scores: [
            {
              score: 97.42608580155614,
              type: 'exam',
            },
            {
              score: 14.83416623719906,
              type: 'quiz',
            },
            {
              score: 55.01726616178844,
              type: 'homework',
            },
            {
              score: 3.0172661617884,
              type: 'homework',
            }
          ],
        },    
        {
          name: 'Demarcus Audette',
          scores: [
            {
              score: 47.42608580155614,
              type: 'exam',
            },
            {
              score: 44.83416623719906,
              type: 'quiz',
            },
            {
              score: 19.01726616178844,
              type: 'homework',
            },
            {
              score: 39.0172661617884,
              type: 'homework',
            }
          ],
        },
      ], function(err, result) {
        if (err) {
          throw err;
        }
    
        //聚合
        student.aggregate([
          {$unwind: '$scores'},
          {$group: {
            '_id': {
              '_id': '$_id',
              name: '$name',
              type: '$scores.type',
            },
            score: {
              '$max': '$scores.score'
            }
          }},
          {$project: {
            '_id': {
              _id: '$_id._id',
              name: '$_id.name',
            },
            scores: {
              type: '$_id.type',
              score: '$score',
            },
          }},
          {$group: {
            '_id': '$_id',
            scores: {
              '$push': '$scores',
            }
          }}
        ], function(err, result) {
          if (err) {
            throw err;
          }
    
          //循环结果
          result.forEach(function(item) {
            item = {
              _id: item._id._id,
              name: item._id.name,
              score: item.scores
            };
            updateData(item);
          });
        });    
    
      });
    
    
    });
    0 0
相关问答

2

回答

阿里云 MongoDB 云数据库技术优势是什么?

2021-12-14 22:53:17 477浏览量 回答数 2

1

回答

阿里云 MongoDB 云数据库技术优势

2021-01-08 20:18:04 516浏览量 回答数 1

0

回答

云数据库 MongoDB版使用前须知

2017-10-30 16:04:04 1252浏览量 回答数 0

0

回答

云数据库 MongoDB 版的使用前须知

2017-10-30 15:30:35 1115浏览量 回答数 0

0

回答

如何在云数据库 MongoDB中重置密码

2017-10-30 16:47:40 1467浏览量 回答数 0

0

回答

如何在云数据库 MongoDB 版获取连接实例七要素

2017-10-30 15:37:51 1594浏览量 回答数 0

0

回答

如何在云数据库MongoDB 版中获取连接实例七要素

2017-10-30 16:08:23 1436浏览量 回答数 0

0

回答

如何在云数据库 MongoDB 版设置白名单

2017-10-30 15:35:30 1919浏览量 回答数 0

0

回答

如何在云数据库MongoDB 版中设置白名单

2017-10-30 16:06:28 2183浏览量 回答数 0

0

回答

云数据库 MongoDB 版支持哪些语言的客户端进行连接?

2017-10-30 17:43:07 1489浏览量 回答数 0
+关注
文章
问答
问答排行榜
最热
最新
相关电子书
更多
阿里云MongoDB备份恢复功能说明和原理介绍
立即下载
开源数据库 MongoDB 专场 MongoDB疑难杂症分析及优化
立即下载
《阿里云数据库 MongoDB 专属集群版》
立即下载