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. .PHONY makefile中的伪目标

    我的理解: 拿clean举例,如果make完成后,自己另外定义一个名叫clean的文件,再执行make clean时,将不会执行rm命令. 为了避免出现这个问题,需要.PHONY: clean === ...

  2. zabbix fast

    源码安装步骤 来源它站: 官方文档:https://www.zabbix.com/documentation/2.4/manual/installation/install#from_the_sour ...

  3. 详细故障排除步骤:针对 Azure 中到 Windows VM 的远程桌面连接问题

    本文提供详细的故障排除步骤,用于为基于 Windows 的 Azure 虚拟机诊断和修复复杂的远程桌面错误. Important 若要消除更常见的远程桌面错误,请务必先阅读远程桌面的基本故障排除文章, ...

  4. java "Too small initial heap" 错误

    Tomcat内存配置 JAVA_OPTS="-server -Duser.timezone=GMT+08-Xms1024m -Xmx1024m -XX:PermSize=1024m -Xmn ...

  5. 【Leetcode】【Easy】Compare Version Numbers

    Compare two version numbers version1 and version2.If version1 > version2 return 1, if version1 &l ...

  6. Qt Mysql驱动编译过程

    1.首先当然是要有VS2008+Qt4.7的开发环境. 2.安装MySQL,最好是4以后的版本,安装MySQL时要勾住“C Include Files 和 Lib Files”选项,这样才能装上MyS ...

  7. ASP.NET 控件不可编辑

    前台页面的解析后的html代码为disabled="disabled",而在后台我们需要设置控件的Enabled=false:即可.

  8. iOS真机命令(自动化测试)

    获取设备的的UDID idevice_id --list # 显示当前所连接设备的 udid instruments -s devices # 列出所有设备,包括真机.模拟器.mac idevicei ...

  9. 如何用iOS工程生成iOS模拟器包

    1. 在终端上运行下面的命令来查找你的机器上可用的SDK的版本 xcodebuild -showsdks 2. 创建模拟器包: xcodebuild -workspace ** -scheme ** ...

  10. BZOJ 1002 轮状病毒 矩阵树定理

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1002 题目大意: 给定n(N<=100),编程计算有多少个不同的n轮状病毒 思路 ...