【问题标题】:can not insert document (record) into mongodb无法将文档(记录)插入 mongodb
【发布时间】:2016-08-11 08:53:54
【问题描述】:

我正在 MEAN STACK 中开发项目,我需要导入国家、州和城市 来自以下代码。
我可以从 json 文件中导入国家和州,但城市只能导入第一个文档(记录)而不是全部。

Route.js

router
    .route('/api/user/loadcity')
    .get(
        function(req, res, next) {
            var fs = require("fs");
            fs.readFile('/home/user7/Downloads/city.json', 'utf8', function (err,data) {
              data = JSON.parse(data);
              for(var i = 0; i < data.length; i++) {
               console.log(data[i].city_name);
                var newCity = new City({
                    id:data[i].id,
                    country_id : data[i].country_id,
                    state_id : data[i].state_id,
                    city_name : data[i].city_name,
                    is_active : data[i].is_active
                });
                newCity.save(function (err) {
                    if(err){
                        console.log(err);
                    }
                });
              }
            });
        });


router
    .route('/api/user/loadcountry')
    .get(
        function(req, res, next) {
            var fs = require("fs");
            fs.readFile('/home/user7/Downloads/country.json', 'utf8', function (err,data) {
              data = JSON.parse(data); 
              for(var i = 0; i < data.length; i++) {
               //console.log(data[i].city_name);
                var newCountry = new Country();
                newCountry.id = data[i].id;
                newCountry.country_name = data[i].country_name;
                newCountry.country_code = data[i].country_code;
                newCountry.country_flag = data[i].country_flag;
                newCountry.is_active = data[i].is_active;
                newCountry.save(function (err) {
                    if(err) console.log(err);
                });
              }
            });
        });



router
    .route('/api/user/loadstate')
    .get(
        function(req, res, next) {
            var fs = require("fs");
            fs.readFile('/home/user7/Downloads/state.json', 'utf8', function (err,data) {
              data = JSON.parse(data); 
              for(var i = 0; i < data.length; i++) {
               console.log(data[i].state_name);
                var newState = new State({
                    id:data[i].id,
                    country_id : data[i].country_id,
                    state_name : data[i].state_name,
                    is_active : data[i].is_active
                });
                newState.save(function (err) {
                    if(err) console.log(err);
                });
              }
            });
        });

形成上面的代码loadcountry和loadstate路由代码工作正常, 但是 loadcity 路由代码只能插入一个文档(记录)。

依赖关系

country.json  => 
        file size 48.9 kB (48,883 bytes)
        total records 252
state.json    => 
        file size 362.5 kB (3,62,478 bytes)
        total records 2800
city.json     =>
       file size 21.0 MB (2,09,63,600 bytes)
        total records 142987

"express"  => "version": "4.13.4",
"mongoose" => "version": "4.4.4",
"mongodb"  => "version": "2.4.9",
"OS"  => "ubuntu 14.04 lts 32bit",

任何人都可以帮我插入这些所有城市。

【问题讨论】:

    标签: node.js mongodb express mongoose mean-stack


    【解决方案1】:

    我不确定您的 countrystate 是否正常工作。 save 作为 mongodb 中的 I/O 操作本质上是 async,for 循环是 sync。插入的 values 将是数组中的最后一项。

    你可以使用闭包来解决这个问题..

    router
        .route('/api/user/loadcity')
        .get(
            function(req, res, next) {
                var fs = require("fs");
                fs.readFile('/home/user7/Downloads/city.json', 'utf8', function(err, data) {
                    data = JSON.parse(data);
                    for (var i = 0; i < data.length; i++) {
                       (function(i){
                        console.log(data[i].city_name);
                        var newCity = new City({
                            id: data[i].id,
                            country_id: data[i].country_id,
                            state_id: data[i].state_id,
                            city_name: data[i].city_name,
                            is_active: data[i].is_active
                        });
                        newCity.save(function(err) {
                            if (err) {
                                console.log(err);
                            }
                        });
                      })(i);                      
                    }
                });
            });
    

    使用async

      async.forEach(data, function(data, callback) {
    
      });     
    

    【讨论】:

    • 感谢您的建议,但此代码也仅插入第一个文档(记录)而不是全部或最后,请给我其他建议。
    • 使用异步库并使用 async.forEach...这应该可以解决您的问题
    猜你喜欢
    • 2016-04-04
    • 2016-07-02
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    相关资源
    最近更新 更多