千家信息网

MongoDB 表结构分析工具介绍 -- Variety

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,今天给大家介绍一款分析MongoDB数据库表结构的软件 -- Varity.对于MongoDB这种Schema Free的数据库来说,用软件自带的查询collection中存储的数据情况很难一眼就看出
千家信息网最后更新 2026年11月03日MongoDB 表结构分析工具介绍 -- Variety

今天给大家介绍一款分析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,


我事先插入的数据是

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的回显是这样的

> 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查询结果是这样的

mongo test --eval "var collection = 'users'" variety.jsMongoDB shell version: 2.4.9connecting to: testVariety: A MongoDB Schema AnalyzerVersion 1.5.0, released 14 May 2015Using collection of "users"Using query of { }Using limit of 4Using maxDepth of 99Using sort of { "_id" : -1 }Using outputFormat of "ascii"Using persistResults of falseUsing resultsDatabase of "varietyResults"Using resultsCollection of "usersKeys"Using resultsUser of nullUsing resultsPass of nullUsing 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参数:

mongo DATABASE_NAME --port 27111 --eval " var collection = 'COLL_NAME' " variety.js


如果db文件不在默认文件,可以用--dbpath参数:

mongo DATABASE_NAME --dbpath /path/to/database/folder --eval "var collection = 'COLL_NAME' " variety.js


如果需要对查询进行排序的话可以这样用:

mongo DATABASE_NAME --eval "var collection = 'COLL_NAME', sort = { date : -1 }" variety.js


如果需要JSON的输出格式的话可以这样用:

mongo DATABASE_NAME --eval "var collection = 'users', outputFormat = 'json' " variety.js


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


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

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


db.users.insert({name:"Walter", someNestedObject:{a:{b:{c:{d:{e:1}}}}}});
[ibmcloud@bravo:~/variety04:05]$mongo test --eval "var collection = 'users' " variety.jsMongoDB shell version: 2.4.9connecting to: testVariety: A MongoDB Schema AnalyzerVersion 1.5.0, released 14 May 2015Using collection of "users"Using query of { }Using limit of 5Using maxDepth of 99Using sort of { "_id" : -1 }Using outputFormat of "ascii"Using persistResults of falseUsing resultsDatabase of "varietyResults"Using resultsCollection of "usersKeys"Using resultsUser of nullUsing resultsPass of nullUsing 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.jsMongoDB shell version: 2.4.9connecting to: testVariety: A MongoDB Schema AnalyzerVersion 1.5.0, released 14 May 2015Using collection of "users"Using query of { }Using limit of 5Using maxDepth of 3Using sort of { "_id" : -1 }Using outputFormat of "ascii"Using persistResults of falseUsing resultsDatabase of "varietyResults"Using resultsCollection of "usersKeys"Using resultsUser of nullUsing resultsPass of nullUsing 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的,可以这样:

mongo DATABASE_NAME --eval "var collection = 'COLL_NAME', query = {'caredAbout':true}" variety.js

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



参考地址:

http://www.acetolyne.net/Projects7/node/48

https://github.com/variety/variety

http://www.mongoing.com/archives/2282



查询 数据 格式 结构 分析 限制 作者 数据库 数据结构 结果 输出 工具 业务 参数 地址 建议 数量 文件 软件 排序 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 高科技互联网 互联网科技有限公司图片 互联网金融 科技金融 广州宏创互联网科技 北京禾田雨橡互联网科技 互联网科技logo设计 唐信互联网科技 大连 美国互联网前沿科技 隆华科技工业互联网 晓花互联网科技有限公司网址 浙南科技城互联网大厦建设工程 互联网科技如何创业 上海科技产业互联网平台 下一代互联网重大应用科技园 济南小医互联网科技有限公司招聘 普陀区互联网教育科技管理办法 银川新华互联网科技学校是国营吗 西安左小互联网科技有限公司 杭州科技互联网公司有哪些 中国主要互联网科技公司 盈实互联网科技 华宇互联网科技 深圳市运趣互联网科技有限公司 银川新华互联网科技职业技术培训学校图片 中和天地互联网科技有限公司 深圳无忧互联网科技 全球科技与互联网公司市值变化 湖北辰鑫科技互联网 广东猫王互联网科技有限公司电话 互联网的黑科技实验室
0