V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
xiaoming1992
V2EX  ›  问与答

复杂且层级较深的 json 数据用 mongodb 存储合适吗?

  •  
  •   xiaoming1992 · 2019-07-27 09:17:20 +08:00 · 5068 次点击
    这是一个创建于 1947 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我有一个这样的数据(这只是大略意思, 实际大小在压缩后可能达到 100k 左右), 主要前端自用, 以备查询修改, 查询可能涉及到 [使用了红色铁皮所有车型] 。mongodb 可以胜任吗?

    ps: 菜鸡前端, 没怎么正经用过数据库, 所以来问问用过的大佬, 合适就开搞.

    [
      {
        "name": "奥迪",
        "usedNames": [
          "奥迪 A8",
          "a8",
          "奥迪-A8"
        ],
        "seats": [
          {
            "name": "前排",
            "units": [
              {
                "name": "座椅",
                "materials": [
                  {
                    "name": "小牛皮",
                    "colors": [
                      {
                        "name": "红色"
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      },
      {
        "name": "雪佛兰",
        "...": "..."
      }
    ]
    
    17 条回复    2019-07-27 17:56:54 +08:00
    taotaodaddy
        1
    taotaodaddy  
       2019-07-27 09:54:11 +08:00 via Android
    红色座椅的 a8 不多见咧
    Macolor21
        2
    Macolor21  
       2019-07-27 11:19:49 +08:00 via iPhone
    写个算法入库时展平,不然这么深查询起来夜费劲
    DovaKeen
        3
    DovaKeen  
       2019-07-27 11:55:08 +08:00
    会不会是 json 设计的有一些不太合理的地方?
    loading
        4
    loading  
       2019-07-27 11:56:44 +08:00
    树结构一般用 parentID 和 ID 拼起来吧。
    xiaoming1992
        5
    xiaoming1992  
    OP
       2019-07-27 13:08:37 +08:00
    @taotaodaddy 只是打个比方,A8 我都没见过。。。
    xiaoming1992
        6
    xiaoming1992  
    OP
       2019-07-27 13:12:57 +08:00
    @Macolor21 我个搞前端的,说实话,这些东西都不太擅长,目前业务是由我生成 json 配置文件,可是我认为 json 配置文件需要自己一个一个去复制粘贴的修改,很烦,就想搞个可视化界面操作,把这些 json 文件转移到一个本地数据库,加个前端页面,可视化修改本地数据库,需要用的时候再由修改后的数据库来生成目标 json 文件。
    xiaoming1992
        7
    xiaoming1992  
    OP
       2019-07-27 13:21:37 +08:00
    @DovaKeen json 数据是我设计的,一方面,需要配置的项目比较多,业务还存在变动的可能,因此需要一定的自由;另一方面,为了进行数据类型限定,减少人工操作(复制粘贴)出错的可能性,又需要对数据进行限制;再说能力有限,所以 json 设计肯定有不合理的地方,只能说,于我、于我的业务来说,算是当前时间的最优解了吧。
    xiaoming1992
        8
    xiaoming1992  
    OP
       2019-07-27 13:26:33 +08:00
    @Macolor21 连 mongodb 都是没用过现学现卖的,听人说 mongo 适合储存这种键值对数据,就想知道直接当成 json 对象存进去,会不会对性能造成很大影响,毕竟是在本地自己用,查个层级较深的东西 1s 左右能出结果就行了。
    xiaoming1992
        9
    xiaoming1992  
    OP
       2019-07-27 13:30:05 +08:00
    @loading 说实话,这个东西只是我目前整个计划中很小(重不重要另说)的一个环节,还有很多繁杂的东西需要处理
    ```
    树结构一般用 parentID 和 ID 拼起来吧。
    ```
    请问复杂度怎么样?说实话,不太敢随便发散找最优解决方案了,就想赶紧搞个最简单的能用的方案赶紧搞出来。
    xiaoming1992
        10
    xiaoming1992  
    OP
       2019-07-27 13:31:17 +08:00
    整个 json 对象用于生成一个比较复杂的页面,所以配置项比较丰富。
    gustav
        11
    gustav  
       2019-07-27 13:39:00 +08:00
    可以没问题,Mongo 每次都是读取整个 bson,解析处理的,层级再深也不会有啥区别,影响性能的主要是 bson 的大小
    xiaoming1992
        12
    xiaoming1992  
    OP
       2019-07-27 13:48:10 +08:00
    @gustav 那如果我需要根据一个层级比较深的值来对整个数据库进行排序,mongo 岂不是要读取整个数据库?
    请问假设要对`100 个` `(经过压缩后)100k`的 json 文件进行排序,能否在 1min 这个量级的时间内搞定?
    gustav
        13
    gustav  
       2019-07-27 14:07:18 +08:00
    @xiaoming1992 你没建索引,当然要一个个读取,这很正常
    DovaKeen
        14
    DovaKeen  
       2019-07-27 14:37:12 +08:00
    我记得 MongoDB 可以在嵌套域和嵌套数组域上建索引的,这里应该不会有很大的问题把
    Hyvi
        15
    Hyvi  
       2019-07-27 15:13:45 +08:00 via Android
    查询就很麻烦
    xiaoming1992
        16
    xiaoming1992  
    OP
       2019-07-27 17:39:50 +08:00 via Android
    算了,我还是这几天搞一下实践一下吧,反正是本地自己用,只要查询没到分钟级就可以用。
    1981
        17
    1981  
       2019-07-27 17:56:54 +08:00
    看到题主所说的数据自用 100k,感觉没必要上数据库,直接存 js 里或者 xml 里

    想到自己一个实例
    https://github.com/insoxin/API/blob/master/gy/index.html
    ```
    jQuery.getScript("https://api.isoyu.com/gy/data.js", function () {
    var max = jsondata.data.length;
    var num = Math.round(Math.random() * max);
    var picUrl = jsondata.data[num].child_pic;
    var moreUrl = jsondata.data[num].url;
    var more = ' <a href="' + moreUrl + '" target="_blank">详细情况</a>|<a href="https://api.isoyu.com/" target="_blank">姬长信 API</a>';
    var name = '<strong>' + jsondata.data[num].name + '</strong>';
    var sex = '(' + jsondata.data[num].sex + ")" + ',';
    var birthTime = '<br/><b>出生日期:</b>' + jsondata.data[num].birth_time + ',';
    var lostTime = '<br/><b>失踪时间:</b>' + jsondata.data[num].lost_time + ',';
    var lostPlace = '<br/><b>失踪地点:</b>' + jsondata.data[num].lost_place + ',';
    var childFeature = '<br/><b>失踪人特征描述:</b>' + jsondata.data[num].child_feature;

    $('h2').text("");
    $('.api-isoyu-com').attr("src", picUrl);
    $('p.text-muted').addClass('text-left').html(name + sex + birthTime + lostTime + lostPlace + childFeature + more);
    });
    function GetQueryString(name) {
    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
    var r = window.location.search.substr(1).match(reg);
    if (r != null) return unescape(r[2]);
    return null;
    }
    if (GetQueryString('id') !== null) {
    location.pathname = GetQueryString('id');
    }

    ```
    https://github.com/insoxin/API/blob/master/gy/data.js
    ```
    {"id":"#","name":"#","sex":"#","birth_time":"#","lost_time":"#","child_pic":"#","lost_place":"#","url":"#","child_feature":"#","ext2":"#","ext1":"#","city":"#","province":"#","expire":"#","api":"https://api.isoyu.com/"},

    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2778 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 06:16 · PVG 14:16 · LAX 22:16 · JFK 01:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.