xiaoming1992
V2EX  ›  问与答

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

  •  
  •   xiaoming1992 · Jul 27, 2019 · 5621 views
    This topic created in 2525 days ago, the information mentioned may be changed or developed.

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

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

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

    ```
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5279 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 53ms · UTC 09:04 · PVG 17:04 · LAX 02:04 · JFK 05:04
    ♥ Do have faith in what you're doing.