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

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

  •  
  •   xiaoming1992 · 80 天前 · 1576 次点击
    这是一个创建于 80 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    ```
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1067 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 22ms · UTC 18:58 · PVG 02:58 · LAX 11:58 · JFK 14:58
    ♥ Do have faith in what you're doing.