MongoDB.WebIDE:升级版的Mongodb管理工具

2023-10-27

很早以前收藏了一片文章:《强大的MongoDB数据库管理工具》。最近刚好要做一些MongoDB方面的工作,于是翻出来温习了一下,用起来也确实挺方便。不过在使用过程中出现了一些个问题,加上更喜欢MongoUVE的操作习惯,于是决定“自己动手,丰衣足食”,写一个升级版的工具。

一、升级的基础内容
  1. 原版是用的WebForm开发的,新版打算升级到MVC
  2. 前端框架使用bootstrap
  3. Mongodb的驱动程序改为使用官方版的驱动程序
  4. 原版查询数据时使用的是解析sql语句的方式,新版打算采用javascript shell命令
  5. 原有的功能点都进行一些辅助性的改进

下面在对各个功能介绍的过程中,对升级的细节进行逐一的介绍,改动的地方会增加下划线进行标注。

二、系统主界面

系统主界面如下:

主界面

主界面采用了bootstrap的栅格系统进行布局:顶部为banner导航,左侧为Mongo对象的树菜单区域,右侧为功能操作的主区域。点击顶部banner和左侧上部的刷新图标均能重新加载主界面。主区域默认进入服务器管理的界面。

 View Code

本例中,树菜单里的测试服务器有两个,是在本机通过不同端口建立的两个MongoDB实例,用来进行主从库的模拟(这个在后面会用到)。

三、Mongo对象的树菜单

首先,树菜单采用了zTree控件代替了原来的TreeView控件。zTree是一个非常好用的树控件,它支持json数据绑定,支持异步加载,对节点的控制和操作都非常强大,甚至可以直接在树节点上编辑数据。个人非常推荐这个控件。点击这里可以进入zTree控件的官网。

其次,Mongo对象的采用了“服务器 》数据库 》 数据表 》 字段和索引”的层次结构。因为字段和索引都处在表节点的下级,因此加入了两个虚拟节点【表信息】和【索引】来进行分类组织。并且点击不同的对象节点会触发不同的操作。

按照MongoUVE的表现形式,表节点右边增加了该表的数据总量的显示,字段节点右边增加了该字段的数据类型的显示。具体界面如下图:

树菜单

系统定义了树节点的数据结构:MongoTreeNode,用来生成绑定树控件的json数据。每个节点对应的对象类型也定义了对应的枚举:MongoTreeNodeType。代码如下:

 View Code

zTree控件在绑定之前需要对各种属性进行预定义,详情请参考zTree控件的API手册。在本系统中预制了ID和PID字段作为父子关系绑定的字段,而控件默认值是id和pId字段。

 View Code

*注意:在实际使用的过程中,在调用树控件的绑定方法时,偶尔还会报“找不到绑定字段ID”的错,导致树控件无法显示。这个问题有待解决。

系统还定义了Mongo对象的数据结构,主要有“服务器、数据库、数据表 、字段和索引”五种(具体见代码)。对象的ID字段分别对应于树节点的ID和PID字段,即数据库对象的ID,既对应数据库节点的ID字段,又对应表节点的PID字段。对这些对象的结构定义,比原版系统精简了很多。

在读取数据表对象时,过滤了一些系统表和有特殊意义的表(如索引表,profile数据表)。如果需要放开显示的话,可以去程序中进行屏蔽。代码如下:

 View Code

有一个改进是:对象ID字段的数据类型从原来的GUID改为uint类型(为了保证数值大于0,切避免出现正值和负值取绝对值后重复的可能性,才采用无符合数),以提高查找效率并减小json数据的大小。ID字段是由程序自动生成的唯一的随机值,它是在一个并行计算(之后会讲到)过程中得到的。为了保证在并行环境中随机数的唯一性,参考了《如何在高并发分布式系统中生成全局唯一Id》这篇文章。最后形成的代码很简单,经过测试到目前为止还没有出现过ID值重复的情况。代码如下:

 View Code

Mongo对象和树节点是同一时间读取的,在第一次加载完后就会保存至缓存中,缓存时间为2小时。当缓存超时后再点击树菜单节点或进行其他操作时,在主区域都会出现如下的界面,要求重新加载数据:

缓存超时

上面提到的并行计算的方法,是在每次从数据库中加载数据时才会调用,这也是本次一大改进。通过采用并行计算,确实提高了读取数据的效率,数据库内对象越多越明显。关于并行计算的学习,我推荐《8天玩转并行开发》这一系列的文章,非常好。新版系统的代码里保留了循环读取Mongo对象的代码,有兴趣的朋友,可以自己修改一下程序去体会一下并行和循环的差别。为了保证在并行计算中的线程安全,树节点采用HashSet进行缓存,HashSet本身是线程安全的;而Mongo对象则采用Hashtable进行缓存,在初始化时,需要使用Synchronized方法来保证线程安全。

 View Code
四、服务器管理

服务器管理界面在初始加载时就会显示在主区域内。通过点击左侧顶部的【Servers】链接,也能操作服务器管理。主区域的操作界面,统一采用了bootstrap中的折叠插件来进行展示,点击不同的折叠栏,会显示该栏的内容同时折叠其他的内容。

服务器列表

服务器添加

服务器管理功能,实质是修改程序里【Config\servers.config】的文件,为其添加或删除节点。文件里保存的数据,作为并行计算读取数据的起点。

五、服务器信息统计

点击树菜单中的服务器节点,就会在主区域内显示该服务器的统计信息。在主区域的顶部,会显示服务器对象的一些基本信息。本系统中,大量的信息展示均使用zTree控件进行展现,因此重用了MongoTreeNode的结构,不同的地方仅在于不需要为MongoTreeNodeType属性赋值。

服务器统计信息

查看服务器的统计信息,实际对应于MongoDB的adminCommand命令:db.adminCommand{"serverStatus", 1}。新版系统实现如下:

 View Code

这里简单介绍一下MongoDB的BsonDocument。详情请移步至官方文档: C# and .Net Mongo Driver

BsonDocument是官方驱动进行各种操作的一个基础数据,它是一个键/值对的集合,有三种生成方式:

  1. 使用Add或者Set方法
     View Code
  2. 使用Add或者Set的流式接口方法
     View Code
  3. 使用C#的类初始化语法(推荐使用此种方法)
     View Code

基于BsonDocument派生出很多子类,包括:

  • CommandDocument:用于运行命令的参数文档,在RunCommand方法中使用
  • FieldsDocument:用于查询返回字段的参数文档,在SetFields方法中使用
  • GroupByDocument:用于group的参数文档(这个的用处暂时没体会得到)
  • QueryDocument:用于设置查询条件的参数文档,在Find方法中使用
  • SortByDocument:用于设置排序规则的参数文档,在SetSortOrder方法中使用
  • UpdateDocument:用于修改数据的参数文档,在Update方法中使用

其他子类和它们的具体使用方法,需要在使用过程中去体会。一般来说,什么样的类型就对应什么样的操作方法。在方法调用的参数接口说明中,都会有比较明显的标识。

六、服务器的主从同步信息

在文章的第一节说明了在本机搭建有主从环境,其中127.0.0.1:27017是主服务器,其中127.0.0.1:28018是从服务器。通过点击【查看同步信息】链接,可以进入查看同步信息的页面。

主服务器信息:

主服务器

主服务器的同步日志,新版系统设定为仅显示10条记录,可以自己进行修改:

同步日志

从服务器信息:

从服务器

从服务器的源信息:

从服务器的同步信息

服务器的主从信息也都是使用adminCommand命令来获取。主服务器的同步日志则是从local库中的【oplog.$main】表中读取,从服务器的源信息则是从local库中的【sources】表读取。实现代码:

 View Code
七、数据库的统计信息

点击树菜单中的数据库节点,就会在主区域内显示该数据库的统计信息。在主区域的顶部,会显示数据库对象的一些基本信息。

数据库统计信息

数据库的统计信息是使用RunCommand命令来获取,因为是查看某个具体数据库的统计信息,因此不需要使用Admin库,即不使用adminCommand。代码如下:

 View Code
八、数据库的Profile优化

在数据库的统计信息页面点击【Profile优化】的链接,即进入数据库的Profile设置的界面。Profile的状态一共有三种:

  • 不开启:即不记录pofile数据,这样就无法进行效率分析
  • 记录慢命令:仅记录执行速度慢的profile数据,可以自行设置判断是否是慢命令的执行时间的临界值,一般推荐此种方式
  • 记录所有命令:记录所有执行的profile数据,因为记录profile数据也需要系统资源和开销,因此不推荐开启记录所有命令的方式

设置profile

查看Profile数据,可以自行调整显示的条数。官方驱动返回的数据类型是 SystemProfileInfo,大家可以查看源代码获得详细的信息。在本系统中选取了其中几个属性进行了一下转换,并采用更直观的列表形式来进行展示。

proflie数据

优化的一些小建议:

  1. 当【扫描记录数】远大于【返回记录数】,可以考虑通过增加索引来优化查询效率
  2. 当【返回结果集】过大,那么说明我们返回的结果集太大了,可以考虑只返回所需要的字段
  3. 如果写查询量或者update量过大的话,多加索引是会有好处的;执行 update 操作时同样检查一下【扫描记录数】,并使用索引减少文档扫描数量
  4. 如果读操作很少,那么尽量不要添加索引,因为索引越多,写操作会越慢;如果读操作很多,则需要考虑创建合适的索引
九、数据表的统计信息

点击树菜单中的数据表节点,就会在主区域内显示该数据表的统计信息。在主区域的顶部,会显示数据表对象的一些基本信息。

数据表信息

数据表的统计信息是使用RunCommand命令来获取,需要在某个具体的数据库上执行该命令,并需要传入对应表的名称。代码如下:

 View Code
十、查看数据

在数据表统计信息的页面点击【查看数据】链接,或者是点击树菜单中的【表信息】节点,均可以进入数据查看页面。注意:【表信息】的子节点是字段节点,点此节点不做任何操作。

查看数据

数据查询的操作方式抛弃了原版系统解析sql语句的方式,采用了类似MongoUVE的操作形式,输入json格式的命令进行查询。新版系统可设置【find、sort、skip、limit】的参数。查询结果采用列表方式展示,表头内显示字段名以及该字段的数据类型。在显示数据时,当数据为BsonDocument类型时,做了序列化字符串的处理。

查询结果

在实现利用javascript shell命令进行查询时,差点绕了一个大圈子:一开始觉得需要做一个javascript shell命令解析器,再配合MongoDB.Driver.Builders.Query类来生成查询用的QueryDocument。一开始做了一个or命令的解析,例如:{$or:[{Word:'汶川县'},{Pos:{$gt:256}}]},觉得太难了,各种嵌套怎么解析得完?官方驱动怎么可能对javascript shell命令的支持这么差?于是开始翻源代码,突然看到一个方法:BsonDocument.Parse!!然后一切都容易了。查询实现的方法如下:

 View Code

新版系统增加了查看执行计划的功能。在此可对查询语句的执行效率进行分析,从而协助进行系统优化。目前仅支持【find、sort】的参数设定。

执行计划

 执行计划结果

十一、索引管理

在数据表统计信息的页面点击【查看索引】链接,或者是点击树菜单中的【索引】节点,可进入索引管理页面。该页面提供索引列表展示,删除索引以及添加索引的功能。注意:【索引】的子节点是索引节点,点此节点不做任何操作。

索引列表

新增索引时,可以使用多个字段生成组合索引。目前不支持当某个字段为文档类型时,使用内部字段设置索引的情况。另外索引在创建时的一些选项的意义也做了相应的说明。

索引管理

十二、后记

对于这个新版系统上面介绍了很多,目前还缺少一部分的功能,例如数据的新增和修改的操作;Mapreduce的支持;甚至自定义javascript shell命令的执行(类似执行自定义的sql语句)等……欠缺的功能以后有时间再慢慢补上来的。

在介绍的过程中也穿插的展示了一部分代码,但没有对系统的代码进行完整的介绍,理由是整套代码几乎没有难度,况且代码就是最好的文档,而整个系统的代码量并不大。开发过程主要是加深对MongoDB的一些概念的认识,再配合官方驱动的各种方法进行佐证。

那么,最后,问题来了……代码在哪里呢?中国XX找XX吗?当然不是,代码下载请点下图:

下载

转载于:https://www.cnblogs.com/xieyulin/p/7085646.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoDB.WebIDE:升级版的Mongodb管理工具 的相关文章

  • excel服务器bom修改,勤哲Excel服务器物料清单BOM表的实现方法

    一 什么是BOM 在企业信息化进程中 经常会涉及到BOM表 BOM数据等 那么什么是BOM呢 简单的说BOM Bill of Material 就是物料清单 用计算机辅助企业生产管理 首先要使计算机能够读出企业所制造的产品构成和所有要涉及的
  • Hibernate 配置文件(hibernate.cfg.xml、hbm.xml)

    目录 Hibernate xml 1 数据库的基本信息 2 集成 C3P0 设置数据库连接池信息 3 Hibernate 基本信息 4 注册实体关系映射文件 实体关系映射文件 实体类文件名 hbm xml 1 hibernate mappi
  • Hive 删除表报错: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask.

    操作Hive 的时候报错 提示如下 hive gt drop table toss1 FAILED Execution Error return code 1 from org apache hadoop hive ql exec DDLT
  • 点开软件显示从服务器返回参照,win10打开软件从服务器返回了一个参照怎么解决...

    很多网友刚升级了windows10系统的 就出现了从服务器返回了一个参照的问题 更升级了系统对出现这样的问题 很多网友不知所措 不知道该怎么办 不要急 就让win10官网小编告诉大家win10打开软件从服务器返回了一个参照解决方法吧 win
  • 学生宿舍管理系统ASP .NET CORE MVC

    学生宿舍管理系统 管理系统应设计的主要功能和数据要求 管理系统应设计的主要功能和数据要求 用户管理 将系统用户分为学生用户 类 管理员类 学生用户只能查询和修改自己的基本信息 管理员可以 使用本 系统的所有功能 学生宿舍管理 学生用户可以查
  • 简单实现x的n次方(10 分)

    简单实现x的n次方 10 分 本题要求实现一个计算x n n 0 的函数 函数接口定义 double mypow double x int n 函数mypow应返回x的n次幂的值 题目保证结果在双精度范围内 裁判测试程序样例 include
  • YOLOv3-药草识别实现

    一 标注工具 labelimg 使用工具lableimg 1 操作步骤 使用cmd进入下载目录之后 使用python lableimg进入标注工具 open选择文件之后 选择Create nRectBox进行选择区域 并且标注药草名 如下
  • 爬虫逆向学习进阶路线

    大数据时代下 爬虫技术逐渐成为一套完整的系统性工程技术 涉及的知识面广 平台多 技术越来越多样化 对抗性也日益显著 大家可以参考一下学习路线 看看自己需要对哪些知识进行补充 爬虫逆向学习路线 学习路线总结 系统提高 加密算法特征和实现 传输
  • [创业之路-51] :动态股权机制 -6- 创始团队股权比例如何分配比较合理

    创始团队股权比例如何分配 可以参考以下几个标准 提出创意并获得执行可以先分10 不能只是空点子 要执行并落地 最初召集大家一起创业的创始人可以多分5 创始人是公司主要运营负责人的额外多分5 让公司发展从0到1 增加5 20 例如建立良好的市
  • 八目云播服务器维护,LiveQing 云平台直播点播使用说明

    LiveQing 云平台直播点播使用说明 下载安装包 zip 是windows环境中使用的安装包 tar gz 是linux环境中使用的安装包 Windows下安装 说明 Windows 64位 系统 下载的安装包放置在任意一个目录下 解压
  • CSS笔记

    2 3 4 5
  • 在Spark上运行apache beam

    目录 apache beam 个人使用经验总结目录和入门指导 Java 为了方便 以下面这个名字替换的程序做简单例子 The ReplaceMyName 把Create数组里的myName替换成xxx since 2019 12 17 pu
  • [C语言]define 定义常量/宏

    1 运用define定义常量 2 运用define定义宏 1 运用define定义常量 格式 define 符号 数值 define A 100 定义后的常量 作用域在整个项目 可以跨源文件调用 2 运用define定义宏 宏与函数其实十分
  • 学习PWM——控制的关键

    目录 一 PWM的简介 1 PWM是什么 2 PWM的参数 1 PWM的频率 2 PWM的周期 3 占空比 3 PWM的原理 1 高级输出比较通道 2 通用输出比较通道 3 输出比较模式 二 PWM的结构 1 PWM的基本结构 2 参数计算
  • Blip2 文章阅读

    论文地址https arxiv org pdf 2301 12597 pdf BLIP 2 Bootstrapping Language Image Pre training with Frozen Image Encoders and L
  • 【PyTorch教程】05-如何使用PyTorch训练神经网络模型 (2022年最新)

    本期目录 使用PyTorch训练神经网络 torch autograd 1 神经网络背景 2 加载预训练模型 有重大更新 2 1 新老版本写法对比 2 2 新写法的好处 2 3 图像数据的预处理 2 4 训练模式和验证模式之间的转换 3 正
  • 机器学习技术(六)——有监督学习算法之线性回归算法实操

    机器学习技术 五 有监督学习之线性回归算法实操 引言 机器学习监督算法是一种基于已有标记数据的学习方法 通过对已知输入和输出数据的学习 建立一个模型来预测新的输入数据的输出 这种算法模仿人类的学习过程 从已有的经验中总结规律 并将其应用于新
  • python在excel表里如何新增一列或者一行?新增之后,公式和合并单元格会怎样变化?

    首先导入openpyxl库 即 import openpyxl as op 然后打开你已有的excel 即 wb op open 新增一列 xlsx 打开新增一列 xlsx这个工作簿 ws wb Sheet1 打开Sheet1这个工作表 我
  • 2020-09-06

    Nexus仓库管理服务 1 Nexus端口为8081 Nexus是Maven仓库管理器 如果你使用Maven 你可以从Maven中央仓库下载所需要的构件 artifac 但这通常不是一个好的做法 你应该在本地假设一个Maven仓库服务器 在
  • 静态代码分析工具列表分析---代码分析工具列表(30款工具)

    本文是一个静态代码分析工具的清单 共有30个工具 包括4个 NET工具 2个Ada工具 7个C 工具 4个Java工具 2个JavaScript工具 1个Opa工具 2个Packaging工具 3个Perl工具 1个Python工具 1个嵌

随机推荐

  • qt采用opengl显示yuv视频数据

    作者 使徒保罗 邮箱 297329588szh 163 com 声明 欢迎交流学习 如有任何疑问 请通过邮箱联系本人 应用场景 qt opengl渲染yuv420p数据 开发环境 win7 64位 qt opensource windows
  • WEB-CTF通关教程二

    信息泄露的第二关 进去页面如下 查看源代码发现后缀为 sql的文件 看见这个文件思路就是把这个文件下载下来查看敏感数据 尝试在链接后直接加文件名 发现直接下载了我们的文件 使用记事本打开文件 得到flag值 暴力破解第二关 打开页面提示如下
  • 将手机号中间四位进行隐藏操作(Java)

    import java util Scanner public class StringExample2 public static void main String args 将手机号中间四位数字用 来替代 用截取字符串的方法 将前三位和
  • 有点问题的代码

    一个有问题的程序 import javax swing import java awt event import java awt class EditBook public static void main String args Edi
  • 详解 http-server的安装和使用

    简介 http server 命令行http服务器 http server是一个简单的零配置命令行http服务器 它足够强大 足以用于生产用途 但它既简单又易于破解 可用于测试 本地开发和学习 使用前提 http server 基于node
  • Android:位置服务

    前言 在开发 Android 位置相关应用时 可以从 GPS 全球定位系统 passive network 获取用户位置 通过 GPS 能获得最精确的信息 LocationProvider 是位置源的意思 用来提供定位信息 常用的 Loca
  • Apriori算法是什么?适用于什么情境?

    Apriori适用于什么场景 Apriori算法是常用的用于挖掘出数据关联规则的算法 它用来找出数据值中频繁出现的数据集合 找出这些集合的模式有助于我们做一些决策 例如什么商品集合顾客会在同一次购物中购买 最著名的例子莫过于啤酒与尿布的故事
  • Android蓝牙开发的一些经验

    http blog csdn net icyfox bupt article details 25487125 先说一下背景 我是开发手机与带蓝牙的智能设备 蓝牙血压计 血糖仪 手环等 设备对接的APP 也就是说 在设备端没有什么可以操作的
  • 面试官:我就问了一个JVM性能调优,没想到他能吹半个小时

    一 JVM内存模型及垃圾收集算法 1 根据Java虚拟机规范 JVM将内存划分为 New 年轻代 Tenured 年老代 永久代 Perm 其中New和Tenured属于堆内存 堆内存会从JVM启动参数 Xmx 3G 指定的内存中分配 Pe
  • 迟来的函数传参补充——传引用【引用调用】【c++】

    文章目录 1 传引用 1 1 特点 1 2 使用 1 2 1 一般引用 1 2 2 常量引用 1 3 案例 1 3 1 常见变量引用做函数参数 1 3 2 结构体引用做函数参数 1 传引用 函数传参 几乎一直在用简单的值传递 或者传指针 前
  • Selenium浏览器自动化测试框架简单介绍

    目录 selenium简介 介绍 功能 优势 基本使用 获取单节点 获取多节点 节点交互 动作链 执行JavaScript代码 获取节点信息 切换frame 延时等待 前进和后退 cookies 选项卡管理 异常处理 选项卡切换 无头浏览器
  • Python--类及其方法

    Python 类及其方法 文章目录 Python 类及其方法 前言 一 类的定义 二 继承类定义 二 类的专业方法 前言 在 Python 中 面向对象编程主要有两个主题 就是类和类实例 类与实例 类与实例相互关联着 类是对象的定义 而实例
  • React怎样在非组件环境下拿到路由信息实现路由跳转

    最近写项目的时候遇到一个问题 如图所示 用户token失效后 页面需要跳转回登录页面 用location href直接赋值会导致页面刷新 对SPA来说是可耻的 而且location href跳转的时候 页面并没有提示信息出现就直接跳转了 然
  • 微信小程序——flex布局

    flex布局的基本知识 flex布局作用于父容器之上 用于控制其子盒子的位置和排列的方式 flex是Flexible Box的缩写 意为 弹性布局 用来为盒状模型提供最大的灵活性 任何一个容器都可以指定为Flex布局 box display
  • 应用层概述、基本原理

    网络应用体系结构 客户机 服务器结构 Client Server C S 点对点结构 peer to peer P2P 混合结构 Hybrid 1 客户机 服务器结构 服务器 7 24小时提供服务 永久性访问地址 域名 利用大量服务器实现可
  • aix安装bff_在AIX中安装与维护软件

    学习内容 在 AIX 中安装与维护软件 学习目标 1 了解安装软件包的含义及命名规则 2 了解 AIX 如何发布补丁 知道自己的 AIX 及已安装软件的版本情况 3 知道如何安装与管理软件及升级 4 会修复损坏的软件 5 知道如何通过 Fi
  • Linux/Windows中根据端口号关闭进程及关闭Java进程

    目录 Linux 根据端口号关闭进程 关闭Java服务进程 Windows 根据端口号关闭进程 Linux 根据端口号关闭进程 第一步 根据端口号查询进程PID 可使用如下命令 netstat anp grep 8088 以8088端口号为
  • java判空方式

    java判空方式 1 数据结构判空 map list set CollectionUtils isEmpty 为空 CollectionUtils isNotEmpty 不为空 2 对象判空 Objects isNull 为空 Object
  • IPv6你知道多少?

    IPv6是什么 互联网协议 IP 地址是分配给连接到互联网的每个设备的数字标识符 从广义上讲 IP地址允许设备相互通信并交换信息 Internet协议版本4 IPv4 于1983年发布 至今仍用于大多数Internet通信 IPv4地址使用
  • MongoDB.WebIDE:升级版的Mongodb管理工具

    很早以前收藏了一片文章 强大的MongoDB数据库管理工具 最近刚好要做一些MongoDB方面的工作 于是翻出来温习了一下 用起来也确实挺方便 不过在使用过程中出现了一些个问题 加上更喜欢MongoUVE的操作习惯 于是决定 自己动手 丰衣