无法将文档(记录)插入mongodb

时间:2016-04-19 09:17:16

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

我正在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",

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

1 个答案:

答案 0 :(得分:1)

我不确定您countrystate的工作正常。在mongodb中保存为I / O操作本质上是async,而循环是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) {

  });