给定一个可以使用的新MongoDB实例,通常很难理解其结构,因为与SQL不同,该数据库本质上没有架构。流行的初始工具是 Variety.js, which 找s all possible 领域 and tells you the types, occurrences and percentages of them 在 the D b.
但是,通常也可以查看字段的内容。为此,您可以使用 找One(),它从集合中获取似乎是最后插入的记录,并将其漂亮地打印到终端。很好,但是有时您希望查看多个记录,以更好地了解字段内容。在这篇文章中,我’将向您展示我如何扩展Mongo来做到这一点。
(假设你’ve已经安装了mongo和git– I 采用 酿造 安装 蒙哥 from the 自制程序包管理器 和git随附Mac上的XCode)
首先,让’s获得mongo的副本’s 码:
1 2 |
脆弱的$ 光盘 ~/文件资料 脆弱的$ 吉特 克隆 https://的github.com/蒙哥db/蒙哥.git |
这将在您的文档中创建一个文件夹,所以让’s 在spect it:
1 2 3 4 |
脆弱的$ 光盘 蒙哥 脆弱的$ ls 亚太地区-2.0.txt GNU-股份公司-3.0.txt 构造 建筑脚本 distsrc 等等 转数 src 贡献.rst 自述文件 建立 Debian docs jstests site_scons |
那里’s quite a lot of 档案 there, it will take a while 至 找 where the 找One() 功能 是 located. Github’的存储库搜索返回太多结果,因此让’而是使用unix文件搜索。 MongoDB用JavaScript编写(并已编译),因此我们需要查找类似 找One = 功能( or 功能 找One( . Try 这个 search:
1 2 3 4 5 |
脆弱的$ 格蕾p -R "找One = 功能(" . ./建立/选择/蒙哥/蒙哥 ./建立/选择/蒙哥/贝壳/蒙哥.cpp ./建立/选择/蒙哥/贝壳/蒙哥.o ./src/蒙哥/贝壳/采集.js |
这两个标志是 -l (小写的L)显示文件名,以及 R 搜索所有子目录。最后的句号表示搜索当前目录。您可以看到它在其中找到了一个javascript文件,“collection.js”. If you open it up 在 a text editor, the 找One() 功能 是 listed:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
数据库集合.原型.找One = 功能( 询问 , 领域, 选项, readConcern ){ 变种 光标 = 这个.找(询问, 领域, -1 / *限制* /, 0 / *跳过* /, 0 / * batchSize * /, 选项); 如果 ( readConcern ) { 光标 = 光标.readConcern(readConcern); } 如果 ( ! 光标.hasNext() ) 返回 空值; 变种 退回 = 光标.下一页(); 如果 ( 光标.hasNext() ) 扔 错误( "找One has more than 1 result!" ); 如果 ( 退回.$呃 ) 扔 _getErrorWithCode(退回, “错误” + 至json(退回)); 返回 退回; }; |
此代码也可以在mongodb 的github页面上找到: //github.com/mongodb/mongo/blob/master/src/mongo/shell/collection.js#L207
我们的功能将扩展findOne而不是查找另一条记录。这可以通过执行“find”使用完全相同的代码,但随后跳过随机的记录数。跳过量必须小于列出的记录数,不幸的是,这意味着我们必须运行两次查询。首先计算结果的数量,其次实际跳过一些数量。
复制 the 找One 功能 and rename it 至 找Another, with these lines 在 the 至p 在stead:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
数据库集合.原型.找Another = 功能( 询问 , 领域, 选项, readConcern ){ // Similar 至 找One but 返回s a different record 每 time //必须先进行两次查询,因为我们需要先知道计数,然后才能 //随机跳过 变种 至tal_records = 这个.找(询问, 领域, -1, 0, 0, 选项).计数(); // 随机 number generation from: http://stackoverflow.com/a/7228322 变种 随机Number = 数学.地板(数学.随机()*(至tal_records+1)+1); 变种 光标 = 这个.找(询问, 领域, -1, 随机Number, 0, 选项); 如果 ( readConcern ) { 光标 = 光标.readConcern(readConcern); } 如果 ( ! 光标.hasNext() ) 返回 空值; 变种 退回 = 光标.下一页(); 如果 ( 光标.hasNext() ) 扔 错误( "找Another has more than 1 result!" ); 如果 ( 退回.$呃 ) 扔 _getErrorWithCode(退回, “错误” + 至json(退回)); 返回 退回; }; |
- 获取查询返回的记录数(存储在total_records中)
- 生成一个介于1到计数之间的随机数(存储在randomNumber中)
- 再次使用该数字作为跳过查询(存储在光标中)
在JavaScript中生成范围内的随机数有点晦涩难懂,但我在StackOverflow上找到了一个有用的技巧来做到这一点: http://stackoverflow.com/a/7228322 in 上e line. I’m 采用d 至 蟒蛇’s ultra simple 随机.randrange().
让’首先测试一下。您’我会注意到所有代码都可以在mongo中返回’s javascript 贝壳:
1 2 3 4 5 6 7 8 9 10 11 |
脆弱的$ 蒙哥 127.0.0.1 MongoDB 贝壳 版: 3.3.1-217-gdfaa843 连接中 至: 本地主机 > > 采用 my_db 切换的 至 D b my_db > D b.柯尔.找One 功能 ( 询问 , 领域, 选项, readConcern ){ 变种 光标 = 这个.找(询问, 领域, -1 / *限制* /, 0 / *跳过* /, 0 / * batchSize * /, 选项); ...等等 |
您实际上可以在终端中实时替换此代码,尽管它赢得了’t be saved 上ce you close it. Try first replacing 找One with a 你好 世界:
1 2 3 4 |
> D b.柯尔.找One = 功能(){返回 '你好,世界'} 功能 (){返回 '你好,世界'} > D b.柯尔.找One() 你好 世界 |
您可以先在终端中通过复制第一个等号之后的所有内容来测试我们的新功能。打开mongoDB 贝壳到您喜欢的数据库并输入 D b.我的收藏.找One = 然后粘贴功能。尝试调用它,它每次应返回不同的结果。
让’的补丁mongodb现在具有我们的功能。我们必须从刚刚下载的源代码编译mongo。
- Save the 采集.js 文件 you just edited with the 新 找Another() 功能
- 确保已安装C ++编译器。一世’m使用gcc(已使用安装) 酿造 安装 海湾合作委员会
- 检查您的处理器有多少个内核。根据Google的说法,我的2.7 GHz Intel i5有4个内核。
- 在同一终端窗口中(仍在mongo文件夹中),键入: 坏话 -j4 蒙哥 and press enter. The 4 这是我拥有的核心数量,并会认真加快速度。 坏话 是一个处理编译, 蒙哥 最后,这表明我们只想修补mongo’s 客户.
您’当scons检查所有内容时,会看到大量绿色文本,然后:
1 2 3 4 5 6 7 8 9 10 |
脆弱的$ 坏话 -j4 蒙哥 坏话: 阅读 脚本 档案 ... 坏话 版: 2.4.1 (等等 等等...) 检查 对于 C 标头 文件 x86intrin。H... (已缓存) 是 坏话: 完成 阅读 脚本 档案. 坏话: 建造 目标 ... 安装 文件: “构建/选择/蒙哥/蒙哥” 如 “蒙哥” 坏话: 完成 建造 目标. 脆弱的$ |
它编译了!现在,我们必须用修改后的版本替换现有的mongo应用程序。让’s do a unix 找:
1 2 3 4 5 6 7 8 9 10 11 12 |
脆弱的$ 须藤 找 / -名称 “蒙哥” 密码: 找: /开发者/fd/3: 不 a 目录 找: /开发者/fd/4: 不 a 目录 /usr/本地/箱子/蒙哥 /usr/本地/地窖/蒙哥db/3.2.0/箱子/蒙哥 /usr/本地/图书馆/别名/蒙哥 /卷数/数据/用户数/脆弱的/文件资料/码/蒙哥 /卷数/数据/用户数/脆弱的/文件资料/码/蒙哥/建立/选择/蒙哥 /卷数/数据/用户数/脆弱的/文件资料/码/蒙哥/建立/选择/蒙哥/蒙哥 /卷数/数据/用户数/脆弱的/文件资料/码/蒙哥/蒙哥 /卷数/数据/用户数/脆弱的/文件资料/码/蒙哥/src/蒙哥 |
我们要替换/ usr / 本地 / 地窖 /中的mongo应用程序(brew安装到的位置)。让’将其备份,然后复制:
1 2 |
脆弱的$ cp /usr/本地/地窖/蒙哥db/3.2.0/箱子/蒙哥 /usr/本地/地窖/蒙哥db/3.2.0/箱子/蒙哥_backup 脆弱的$ cp 蒙哥 /usr/本地/地窖/蒙哥db/3.2.0/箱子/ |
现在,打开一个MongoDB 贝壳到您喜欢的数据库:
1 2 3 4 5 6 7 8 |
脆弱的$ 蒙哥 127.0.0.1 MongoDB 贝壳 版: 3.3.1-217-gdfaa843 连接中 至: 本地主机 > 采用 my_db > my_db.coll。找另外一个() { “_ID” : 对象编号("... 等等... |
Caveats:
- 这可能真的很慢,因为它必须运行两次查询。但是,通常我不’t add super taxing queries 至 找One().
- 如果使用brew重新安装/升级mongo,则可能会替换此功能–他们相当频繁地发布新版本。
改进措施
- 该函数的作用类似于python生成器,保持状态并向前循环直到到达记录集的末尾。这将解决上面的任何缓慢问题,但随机性会降低。