搜尋

首頁  >  問答  >  主體

node.js - mongodb高级修改问题

描述: 格式如下所示,其中每个对象有_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);
    });
});
PHPzPHPz2786 天前558

全部回覆(2)我來回復

  • 黄舟

    黄舟2017-04-17 11:12:39

    雷雷

    回覆
    0
  • 阿神

    阿神2017-04-17 11:12:39

    我估計你想要的是 in place update,比如 findAndEval 類似的方法,然後要讓你失望了

    https://jira.mongodb.org/browse/SERVER-458

    目前為止還沒有實現,被列在 Planning Bucket B 裏,實現目測遙遙無期。


    嗯,上麵說的沒有實現是指沒法在服務器端完成(mongo 和 mongod 的關係)

    如果在客戶端完成,可以用 cursor.forEach 方法,比如

    db.students.find().snapshot().forEach(
      function (e) {
        e.删除score较小的homework!;
        db.students.save(e);
      }
    )
    

    回覆
    0
  • 取消回覆