MongoDB 作为文档型 NoSql 数据库,它的集合表结构往往不像关系型数据库那么固定和统一,同一个集合下的文档(document)的字段变化和差异可能很大,特别是在数据模型缺乏良好规划和规范的数据库。

当接手一个基于 MongoDB 存储、计算的新项目,在缺乏 ORM 等映射抽象的情况下,了解其库表的结构以及集合的Schema十分的重要。MongoBooster(MongoDB4.0 之后为 NoSQlBooster for MongoDB) 可视化数据库客户端是一个方便高效的工具,它集成了mongo Shell,提供了对数据库的各种操作,包括CRUD、数据库表状态查询等等。它非常强大,自然也包含了对 Schema 的分析,遗憾的是,这个功能只对注册用户开放,非注册用户只能在test数据库上做test...

以下对本机mongodb://localhost:27017,localhost:27019,localhost:27020副本集上的test数据库的test集合进行Schema 分析为例。下图为MongoBooster 的Schema 分析结果。

这里,为了表达对自由开放的推崇,对于MongoDB Schema Analyser的功能,我找到了两个替代工具。

Variety.js

> https://github.com/variety/variety

Schema 分析的命令行工具。

命令行调用:mongo [mongoURI] --eval " var collection = 'test'" variety.js

基于javaScript,支持的参数很多,但是运行速度不能报很高期望,对于大集合程序往往也会崩溃。

pyMonSchema

> https://github.com/HanseyLee/pyMonSchema

pyMonSchema是一个基于pyMongo 和 wxPython 实现的 MongoDB Schema Analyser GUI 工具,界面连接和切换数据库集合,支持自定义查询语句、查询排序、限值,支持忽略键名数组及忽略键名的正则表达式,支持嵌套字段的分析。Schema 分析使用MongoDB 的 MapReduce,速度和稳定性上远高于Variety.js。

自定义字段的使用说明:

    - Query -> MongoDB query document to filter input to analyse. e.g. {"keyName": {"$in": ["key1", "key2"]}}, {"keyName": {"$exists": True}}(Note that: PyMonSchema use "eval()" to deserialize query string, so use 'True'/'False' as bool value)
- Order -> Positive/Negative, used in sort document, order=Positive equivalent to sort("_id":1), order=Negative equivalent to sort("_id":-1).
- Limit -> Int, limit value of query result. Empty default is 0, which means no limit.
- Omit_keys -> Fields string to be omitted, sperate by comma. such as: keyName1, keyName2 .
- Omit_patterns -> Fileds match these regular expression patterns will be omitted, sperate by comma. such as: ^keyNameHead, keyNameTail$ .
- Embed-keys -> Whether to analyse embed-key (e.g. keyNameParent.keyNameChild1.keyNameChild2) or not.

注意,这里的Query Document 输入实为字符串,程序会使用python eval 函数对其进行转化为python 对象,如:{"keyName": {"$in": ["key1", "key2"]}}, {"keyName": {"$exists": True}}

pyMonSchema分析的字段类型,对于Number 类型,会进一步推断其为Int32, 或Double类型(MongoDB 默认超过Int32的整数也为Double类型)。



另外,对应分析的结果,还可以保存的json文件,格式如下:

[
{
"key": "_id",
"total_occurrence": 15.0,
"statics": [
{
"type": "ObjectId",
"occurrence": 15.0,
"percent": 100.0
}
]
},
{
"key": "hello",
"total_occurrence": 9.0,
"statics": [
{
"type": "Int32",
"occurrence": 1.0,
"percent": 6.666666666666667
},
{
"type": "String",
"occurrence": 8.0,
"percent": 53.333333333333336
}
]
},
...
]

对于多数据库/集合的批量Schema 分析,pyMonSchema 的 mongoDBM.DBManager 类对此提供了充分的支持,可以使用多进程、多线程来对其进行实现,参考https://blog.csdn.net/fzlulee/article/details/85944967 ,或 github 源码https://github.com/HanseyLee/pyMonSchema。

【正文完】

注,以上内容同步自同名博客 https://blog.csdn.net/fzlulee/article/details/86651664

基于 pyMongo 和 wxPython 实现的 MongoDB Schema Analyser的更多相关文章

  1. (原创) 使用pymongo 3.6.0连接MongoDB的正确姿势

    0.疑惑 前两天使用pymongo连接MongoDB的时候发现了一个奇怪的现象:我本机MongoDB并没有打开,但是使用pymong.MongoClient()进行连接时,并没有异常,我的服务端也正常 ...

  2. 使用PyMongo访问需要认证的MongoDB

    Windows 10家庭中文版,Python 3.6.4,PyMongo 3.7.0,MongoDB 3.6.3,Scrapy 1.5.0, 前言 在Python中,使用PyMongo访问Mongod ...

  3. [持续开源]基于nodejs+ligerui的一款mongodb web 端查询工具(MongoStudio)

    这是我2015年入猫酷写的一款内部工具,目的是为了开发人员可以查询数据库数据以调查线上bug,数据不仅限业务数据及日志数据,其目的是为了避免开发人员直接链接生产环境数据库,以免误操作影响生产. 当时是 ...

  4. MongoDB Schema Design

    Normalization: ...... Relationships: One-to-One relationship: 1-to-many: many-to-many:

  5. mongodb - schema中格式时间

       date:{ type: String,        default: () => moment(new Date()).format('YYYY-MM-DD HH:mm:ss'),   ...

  6. MongoDB Python官方驱动 PyMongo 的简单封装

    最近,需要使用 Python 对 MongodB 做一些简单的操作,不想使用各种繁重的框架.出于可重用性的考虑,想对 MongoDB Python 官方驱动 PyMongo 做下简单封装,百度一如既往 ...

  7. mongodb的python接口pymongo使用

    1. 连接 from pymongo import MongoClient client = MongoClient("mongodb://mongodb0.example.net:2701 ...

  8. pymongo操作mongodb

    此验证中只开启两个mongodb节点,可以连接任意节点,以下操作不涉及读写,不涉及连接那个节点 mongodb连接: from pymongo import MongoReplicaSetClient ...

  9. MongoDB资料大全

    摘要: 为了帮助大家进一步了解MongoDB,云栖社区组织翻译了GitHub Awesome MongoDB 资源,涵盖MongoDB中常见的库与工具.应用列表.以及相关的文档.教程等资源. Mong ...

随机推荐

  1. xshell5 可用注册码

    101210-450789-147200(可以激活Xshell5,而且可以升级) 亲测可用 只能用于xshell5

  2. Linux常用命令(随时补充)

    1.系统 1.1.系统关闭.重启 1)关闭:shutdown -h now 2)重启:reboot.init 6 1.2.修改默认网卡 1)vi /etc/udev/rules.d/70-persis ...

  3. 爬虫入门之scrapy模拟登陆(十四)

    注意:模拟登陆时,必须保证settings.py里的COOKIES_ENABLED(Cookies中间件) 处于开启状态 COOKIES_ENABLED = True或# COOKIES_ENABLE ...

  4. Asp.Net MVC Identity 2.2.1 使用技巧(一)

    开发环境:vs2015 UP3  or  vs2017RC  项目环境:asp.net 4.6.1   identity版本为:asp.net identity 2.2.1 1.创建项目. 没什么好说 ...

  5. 整合VIM和Graphviz,并且使用本办法实现实时预览

    在编程或是整理知识的时候一直苦于没有一款可以帮助理清思路的工具. 在网上苦寻良久,终于找到了一款可心可意的小软件 —— Graphviz. 折腾了一番,终于可以凑合着用了. 现将折腾的成果记录于此以作 ...

  6. 激活老电脑的第二春:内存盘为Chrome浏览器做缓存

    AMD Radeon RAMDisk 4.2.1 正式版 下载地址:http://dl.pconline.com.cn/html_2/1/73/id=7204&pn=0.html 适用于:wi ...

  7. aclocal: error: aclocal: file '/usr/local/share/aclocal/wxwin.m4' does not exist

    1. 查找wxwin.m4文件 mdfind -name wxwin.m4 2. 删除/usr/local/share/aclocal/wxwin.m4,建立软连接 cd /usr/local/sha ...

  8. scala当中的Actor并发编程

    注:Scala Actor是scala 2.10.x版本及以前版本的Actor. Scala在2.11.x版本中将Akka加入其中,作为其默认的Actor,老版本的Actor已经废弃. 1.什么是Sc ...

  9. java多态-向上转型和向下转型

    向上转型:符合“is a”,是安全的,子类向上到父类,多余的属性和方法会丢弃 向下转型:不安全的,用instanceof提前判断一下,以免抛出异常 instanceof用法: result = obj ...

  10. 【[TJOI2017]异或和】

    这道题挺神仙的,毕竟这个异或是需要进位的 看到区间和我们很自然的就想到了前缀和 于是处理一下前缀和答案就变成了这个样子 \[⊕\sum_{i=1}^n\sum_{j=1}^{i}pre_i-pre_{ ...