node.js - mongodb高级修改问题
PHPz
PHPz 2017-04-17 11:10:39
0
2
562

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

学习是最好的投资!

全部回覆(2)
黄舟

雷雷

阿神

我估計你想要的是 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);
  }
)
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板