如何在MongoDB中更新整个数据库中的特定属性?

时间:2017-03-31 09:39:00

标签: javascript node.js mongodb

我想更新整个数据库中的属性。 示例我想更新属性name if name=='Gaurav'然后我想在所有集合中的所有文档中将其替换为name='gsb',无论它是否为嵌套对象属性。有没有办法在不知道文件结构的情况下做到这一点,因为每个集合文件都有不同的结构。我想要这个Node JS的查询。

我尝试的内容如下。我被困在中间。

var MongoClient = require('mongodb').MongoClient;
var config = require('../config.js');
var async = require('async');
_ = require ('lodash');

MongoClient.connect('mongodb://' + config.db_url + '/' + config.db_name, function(err, db) {
    if(err) throw err;
    db.listCollections().toArray(function(err, collInfos) {
    async.each(collInfos,function(collectionDetails,cb){
        db.collection(collectionDetails.name,function(err, collection){
            if(err){
                    console.log(err)
            }
            else
            {
            collection.find().toArray(function(error, result) {
                            if(error) {
                                console.log(error);
                            }
                            else {
                                    _depthFirstSearch = (collection, input) => {
                                       let type = typeof collection;
                                       if (type === 'string' || type === 'number' || type === 'boolean') {
                                         return _.includes(collection.toString().toLowerCase(), input.toString().toLowerCase());
                                       }
                                       return _.some(collection, (item) => this._depthFirstSearch(item, input));
                                     }
                                    var data= _.filter(result, (item) => {
                                         return _depthFirstSearch(item, "Gaurav");
                                       });

                                    console.log(data)                                   

                            }
            });
        }
    })
    cb();
})
});
});

1 个答案:

答案 0 :(得分:0)

经过多次头脑风暴后,我找到了解决方案。我写了下面的函数来实现这个目的。

var replaceAllInsatnceInDB=function(db_url/*localhost:27017*/,db_name,propName,stringToSearch,stringToReplace){
MongoClient.connect('mongodb://' + db_url + '/' + db_name, function(err, db) {
    if(err) throw err;
      db.listCollections().toArray(function(err, collInfos) {
         async.each(collInfos,function(collectionDetails,cb){
            db.collection(collectionDetails.name,function(err, collection){
            if(err){
                console.log(err)
            }
            else
            {   
                collection.find().toArray(function(error, result) {
                    if(error) {
                        console.log(error);
                    }
                    else {
                        result.forEach(function(document){
                        var op=function(record){
                        if(record!== null && record!==undefined ){
                            var props=Object.keys(record);
                            var forObject=function(obj){
                                if(Array.isArray(obj)){
                                var forArray=function(arr){
                                    for(var j=0;j<arr.length;j++){
                                        if(typeof arr[j] ==="string"){
                                            if(arr[j]===stringToSearch  && props[i]==propName){
                                                arr[j]=stringToReplace
                                            }
                                        }
                                        if(typeof arr[j] ==="object"){
                                                                    forObject(arr[j]);
                                                                }

                                                            }
                                                            return(arr)
                                                        }
                                                        obj=forArray(obj)
                                                    }else{
                                                        op(obj);
                                                    }
                                                    return(obj);
                                                }
                                            for(var i=0;i<props.length;i++){
                                                if(typeof record[props[i]] ==="string"){
                                                        if(record[props[i]]===stringToSearch  && props[i]==propName){
                                                            record[props[i]]=stringToReplace
                                                            console.log()
                                                        }
                                                    }
                                                    if(typeof record[props[i]] ==="object"){
                                                        record[props[i]]=forObject(record[props[i]])
                                                    }
                                            }
                                        }
                                            return(record);
                                        }
                                        document=op(document);
                                        collection.update({_id : document._id},document,function(error,doc){
                                            if(error){
                                console.log(error)
                            }else{
                                console.log("template updated");
                            }
                                        })
                                    })


                            }

            });


        }
    })
    cb();
})
});
});
}