设为首页 收藏本站
查看: 1431|回复: 0

[经验分享] MongoDB 表结构分析工具介绍 -- Variety

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-2-29 11:38:42 | 显示全部楼层 |阅读模式
今天给大家介绍一款分析MongoDB数据库表结构的软件 -- Varity.对于MongoDB这种Schema Free的数据库来说,用软件自带的查询collection中存储的数据情况很难一眼就看出具体的数据结构,Tomá Dvoák 作者写了一个Variety.js的脚本就很容易理解没个collection中的数据结构。作者将工具托管在github上,并且欢迎任何人来提供建议或者添加功能。以下Variety的特点翻译自作者的博客:

collection信息输出格式是ASCII的。
  • 可以很清晰看到每个key使用的是什么类型的数据格式
  • 可以看到没个key在这个collection的使用率是多少
  • 可以限制documents的查询数量
  • 可以限制查询documents的深度
  • 可以只分析documents的子集
  • 可以对查询结果排序
  • 可以保存查询结果
  • 可以以JSON格式输出
  • 工具简介易用,没用任何其他库依赖

Variety的下载地址 https://github.com/variety/variety

使用方法:

mongo DATABASE_NAME --eval "var collection = 'COLL_NAME' " variety.js,比如我的DATABASE_NAME 是test, COLL_NAME是users,

我事先插入的数据是
1
2
3
4
db.users.insert({name: "Tom", bio: "A nice guy.", pets: ["monkey", "fish"], someWeirdLegacyKey: "I like Ike!"});
db.users.insert({name: "Dick", bio: "I swordfight.", birthday: new Date("1974/03/14")});
db.users.insert({name: "Harry", pets: "egret", birthday: new Date("1984/03/14")});
db.users.insert({name: "Shanker", bio: "a va?"});




正常的查询Users的回显是这样的
1
2
3
4
5
> db.users.find()
{ "_id" : ObjectId("56cfc28fbdae9b9a922a19cb"), "name" : "Tom", "bio" : "A nice guy", "pets" : [  "monkey",  "fish" ], "someWeirdLegacyKey" :                                                                                     "I like ike!" }
{ "_id" : ObjectId("56cfc2acbdae9b9a922a19cc"), "name" : "Dick", "bio" : "I swordfight." }
{ "_id" : ObjectId("56cfc2c6bdae9b9a922a19cd"), "name" : "Harry", "pets" : "egret" }
{ "_id" : ObjectId("56cfc2e0bdae9b9a922a19ce"), "name" : "Shanker", "bio" : "caca" }




用Variety查询结果是这样的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
mongo test --eval "var collection = 'users'" variety.js
MongoDB shell version: 2.4.9
connecting to: test
Variety: A MongoDB Schema Analyzer
Version 1.5.0, released 14 May 2015
Using collection of "users"
Using query of { }
Using limit of 4
Using maxDepth of 99
Using sort of { "_id" : -1 }
Using outputFormat of "ascii"
Using persistResults of false
Using resultsDatabase of "varietyResults"
Using resultsCollection of "usersKeys"
Using resultsUser of null
Using resultsPass of null
Using plugins of [ ]
+--------------------------------------------------------------------+
| key                | types                | occurrences | percents |
| ------------------ | -------------------- | ----------- | -------- |
| _id                | ObjectId             |           4 |    100.0 |
| name               | String               |           4 |    100.0 |
| bio                | String               |           3 |     75.0 |
| pets               | String (1),Array (1) |           2 |     50.0 |
| someWeirdLegacyKey | String               |           1 |     25.0 |
+--------------------------------------------------------------------+



是不是格式很友好,很容易读懂了呢?

如果数据库用的不是默认端口,可以用--port参数:
1
mongo DATABASE_NAME --port 27111 --eval " var collection = 'COLL_NAME' " variety.js




如果db文件不在默认文件,可以用--dbpath参数:
1
mongo DATABASE_NAME --dbpath /path/to/database/folder --eval "var collection = 'COLL_NAME' " variety.js




如果需要对查询进行排序的话可以这样用:
1
mongo DATABASE_NAME --eval "var collection = 'COLL_NAME', sort = { date : -1 }" variety.js




如果需要JSON的输出格式的话可以这样用:
1
mongo DATABASE_NAME --eval "var collection = 'users', outputFormat = 'json' " variety.js




如果一个collection有10亿个数据,我们可以限制查询的数量,用limit来限定:

1
mongo DATABASE_NAME --eval "var collection ='users', limit = 1000 " variety.js



如果某个colletions嵌套的层数太多了,可以用maxDepth来限制查询:

1
db.users.insert({name:"Walter", someNestedObject:{a:{b:{c:{d:{e:1}}}}}});



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
[ibmcloud@bravo:~/variety04:05]$mongo test --eval "var collection = 'users' " variety.js
MongoDB shell version: 2.4.9
connecting to: test
Variety: A MongoDB Schema Analyzer
Version 1.5.0, released 14 May 2015
Using collection of "users"
Using query of { }
Using limit of 5
Using maxDepth of 99
Using sort of { "_id" : -1 }
Using outputFormat of "ascii"
Using persistResults of false
Using resultsDatabase of "varietyResults"
Using resultsCollection of "usersKeys"
Using resultsUser of null
Using resultsPass of null
Using plugins of [ ]
+----------------------------------------------------------------------------+
| key                        | types                | occurrences | percents |
| -------------------------- | -------------------- | ----------- | -------- |
| _id                        | ObjectId             |           5 |    100.0 |
| name                       | String               |           5 |    100.0 |
| bio                        | String               |           3 |     60.0 |
| pets                       | String (1),Array (1) |           2 |     40.0 |
| someNestedObject           | Object               |           1 |     20.0 |
| someNestedObject.a         | Object               |           1 |     20.0 |
| someNestedObject.a.b       | Object               |           1 |     20.0 |
| someNestedObject.a.b.c     | Object               |           1 |     20.0 |
| someNestedObject.a.b.c.d   | Object               |           1 |     20.0 |
| someNestedObject.a.b.c.d.e | Number               |           1 |     20.0 |
| someWeirdLegacyKey         | String               |           1 |     20.0 |
+----------------------------------------------------------------------------+
[ibmcloud@bravo:~/variety05:06]$mongo test --eval "var collection = 'users', maxDepth = 3" variety.js
MongoDB shell version: 2.4.9
connecting to: test
Variety: A MongoDB Schema Analyzer
Version 1.5.0, released 14 May 2015
Using collection of "users"
Using query of { }
Using limit of 5
Using maxDepth of 3
Using sort of { "_id" : -1 }
Using outputFormat of "ascii"
Using persistResults of false
Using resultsDatabase of "varietyResults"
Using resultsCollection of "usersKeys"
Using resultsUser of null
Using resultsPass of null
Using plugins of [ ]
+----------------------------------------------------------------------+
| key                  | types                | occurrences | percents |
| -------------------- | -------------------- | ----------- | -------- |
| _id                  | ObjectId             |           5 |    100.0 |
| name                 | String               |           5 |    100.0 |
| bio                  | String               |           3 |     60.0 |
| pets                 | String (1),Array (1) |           2 |     40.0 |
| someNestedObject     | Object               |           1 |     20.0 |
| someNestedObject.a   | Object               |           1 |     20.0 |
| someNestedObject.a.b | Object               |           1 |     20.0 |
| someWeirdLegacyKey   | String               |           1 |     20.0 |
+----------------------------------------------------------------------+




如果需要制定条件的查询,比如carddAbout为true的,可以这样:
1
mongo DATABASE_NAME --eval "var collection = 'COLL_NAME', query = {'caredAbout':true}" variety.js



需要注意的是,Variety在对数据结构进行分析的时候,实际是用MapReduce来做的,会进行全表扫描操作,所以如果是对线上库进行分析,那么建议最好使用一个不提供服务的备份库或者在业务低峰来做。避免给线上业务造成压力。




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-184407-1-1.html 上篇帖子: mongodb主从复制及备份集的部署 下篇帖子: mongodb单机配置shard分片
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表