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

2019-07-27 09:17:20 +08:00
 xiaoming1992

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

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

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

```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/586626

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX