javascript - 在 Node 服务器上使用 mongoose 将分层 Node 从 json 文件保存到 mongodb 中

标签 javascript json node.js mongodb mongoose

我有一个包含类别列表的 JSON 文件:

"data": {
    "categories": [
        {
            "id": 1,
            "name": "Clothes",
            "children": [
                "Womens",
                "Mens",
                "Children",
                "Baby",
            ]
        },
        {
            "id": "13",
            "name": "Womens",
            "children": [
                "Womens Tops",
                "Womens Bottoms",
                "Womens Accessories",
            ]
        },
        {
            "id": "33",
            "name": "Womens Tops",
            "children": []
        },

在下面的代码中,我尝试/失败了遍历每个 Node 及其子 Node 以构建一个 path 变量,该变量也与 mongo 数据库中的数据一起存储:

for(var i in obj.data.categories) {
    var newCat = {
        name: obj.data.categories[i].name,
        children: obj.data.categories[i].children
    };
    //UPDATE OR CREATE
    Category.findOneAndUpdate({name:obj.data.categories[i].name},newCat,{upsert: true},
        function(err,cat) {
            if(err) { return handleError(res, err); }
            if(cat.children) {
                //BUILD CHILDREN PATHS
                for(var j=0;j<cat.children.length;j++) {
                    var newChildCat = { 
                        name: cat.children[j], 
                    };
                    newChildCat.path = cat.path ? cat.path+','+cat.name : cat.name;
                    Category.findOneAndUpdate({ name: newChildCat.name},newChildCat,{upsert: true},
                        function(childErr, newChildCat) {
                            if(childErr) { return handleError(res, childErr); }
                        }
                    );
                }
            }
        }
     );
}

但是,由于 javascript 异步运行,因此某些 Node 路径会在其父 Node 存储之前存储。

我在这方面仍然是个新手,正在寻找正确/最佳实践的方法来处理依赖于先前创建的对象的异步导入,如上所示。

最佳答案

使用async模块来执行此操作。您需要的函数是async.eachSeries

async.eachSeries(obj.data.categories, function(_cat, cb){
    var newCat = {...};

    Category.findOneAndUpdate({name:_cat.name},newCat,{upsert: true}, function(err,cat) {
        if(cat.children) {
          async.eachSeries(cat.children, function(_cat2, cb2){
            // the code like above with cb2()
          }, cb);
        } else {
          cb()
        }
    });

});

关于javascript - 在 Node 服务器上使用 mongoose 将分层 Node 从 json 文件保存到 mongodb 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30511892/

相关文章:

java - 在 Spring MVC 中,如何在使用 @ResponseBody 时设置 mime 类型 header

c# - 将 Microsoft SQL 数据库迁移/转换为 MongoDB 数据库的最佳方法?

node.js - 根据 key 是否存在进行多重分组

javascript - 我如何制作 Gridview 或 Listview

javascript - Angular UI 网格 - 根据过滤器选择所有内容

c# - 是否可以从 asp.net 中的 radioButton 列表中禁用一个 listItem

java - 将json数组插入sqlite数据库时出现空指针异常

Javascript JSON 数组排序

javascript - SyntaxError : JSON. 解析:youtube api 搜索出现意外字符

javascript - 安装 jsdom - Node js 时出现 MS 错误