基于 pyMongo 和 wxPython 实现的 MongoDB Schema Analyser
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的更多相关文章
- (原创) 使用pymongo 3.6.0连接MongoDB的正确姿势
0.疑惑 前两天使用pymongo连接MongoDB的时候发现了一个奇怪的现象:我本机MongoDB并没有打开,但是使用pymong.MongoClient()进行连接时,并没有异常,我的服务端也正常 ...
- 使用PyMongo访问需要认证的MongoDB
Windows 10家庭中文版,Python 3.6.4,PyMongo 3.7.0,MongoDB 3.6.3,Scrapy 1.5.0, 前言 在Python中,使用PyMongo访问Mongod ...
- [持续开源]基于nodejs+ligerui的一款mongodb web 端查询工具(MongoStudio)
这是我2015年入猫酷写的一款内部工具,目的是为了开发人员可以查询数据库数据以调查线上bug,数据不仅限业务数据及日志数据,其目的是为了避免开发人员直接链接生产环境数据库,以免误操作影响生产. 当时是 ...
- MongoDB Schema Design
Normalization: ...... Relationships: One-to-One relationship: 1-to-many: many-to-many:
- mongodb - schema中格式时间
date:{ type: String, default: () => moment(new Date()).format('YYYY-MM-DD HH:mm:ss'), ...
- MongoDB Python官方驱动 PyMongo 的简单封装
最近,需要使用 Python 对 MongodB 做一些简单的操作,不想使用各种繁重的框架.出于可重用性的考虑,想对 MongoDB Python 官方驱动 PyMongo 做下简单封装,百度一如既往 ...
- mongodb的python接口pymongo使用
1. 连接 from pymongo import MongoClient client = MongoClient("mongodb://mongodb0.example.net:2701 ...
- pymongo操作mongodb
此验证中只开启两个mongodb节点,可以连接任意节点,以下操作不涉及读写,不涉及连接那个节点 mongodb连接: from pymongo import MongoReplicaSetClient ...
- MongoDB资料大全
摘要: 为了帮助大家进一步了解MongoDB,云栖社区组织翻译了GitHub Awesome MongoDB 资源,涵盖MongoDB中常见的库与工具.应用列表.以及相关的文档.教程等资源. Mong ...
随机推荐
- socket概念 套接字
理解socket soxket因为TCP是面向流的,你发的信息如果很多很快,TCP这样就会形成黏包 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socke ...
- 使用MDScratchImageView实现刮奖效果
使用MDScratchImageView实现刮奖效果 https://github.com/moqod/iOS-Scratch-n-See 最终效果: 其实这是使用了别人的东西而已:) 源码: // ...
- Linux Reboot And Poweroff Command
1.Environment:RedHat Linux Enterprise 6+Vmware Workstation 12 Pro 2.Linux shutdown and restart comma ...
- Compare DML To Both REDO And UNDO Size
SUMMARY you can remember undo rule the same to redo if you want demo rule that you can look up the ...
- Retrieving failed records after an SqlBulkCopy exception
Let me start by saying that the idea I used in this article is not originally mine, but since I have ...
- php使用<?php include之后页首有空白
1.今天做这一个页面的时候发现如果使用<?php include包含了一个页面,但是页首始终有一个空白行,度娘出来原来是因为使用了UTF-8格式,应该选择UFT-8无BOM格式的,原来还有这一说 ...
- [BZOJ 3992][SDOI2015]序列统计
3992: [SDOI2015]序列统计 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 2275 Solved: 1090[Submit][Stat ...
- [BZOJ 4555][Tjoi2016&Heoi2016]求和
题意 给定 $n$ , 求下式的值: $$ f(n)= \sum_{i=0}^n\sum_{j=0}^i\begin{Bmatrix}i\\ j\end{Bmatrix}\times 2^j\time ...
- 列表:List<T>与HashSet和只读集合
一.概述 List<T> 是ArrayList类的等效泛型类.属System.Collections.Generic命名空间. 二.声明及初始化 1.List<T> mList ...
- 无法执行程序。所执行的命令为 "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe" /noconfig /fullpaths @"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\b411ea32\b48a9fb\aun5r0xd.c
解决方案 将应用程序池进程模型中的标识设为“LocalSystem”即可.