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