分类档案: 蒙哥 b

Extending MongoDB 找One() 功能 ality 至 找Another()

给定一个可以使用的新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 采用   酿造 安装 蒙哥 自制程序包管理器 和git随附Mac上的XCode)

首先,让’s获得mongo的副本’s 码 :

这将在您的文档中创建一个文件夹,所以让’s 在 spect it:

那里’s quite a lot of 档案 there, it will take a while 至 找 where the 找One() 功能 is located. Github’的存储库搜索返回太多结果,因此让’而是使用unix文件搜索。 MongoDB 用JavaScript编写(并已编译),因此我们需要查找类似 找One = 功能 ( 功能 找One(一种 。试试这个搜索:

这两个标志是 -lÂ(小写的L)显示文件名,以及 RÂ搜索所有子目录。最后的句号表示搜索当前目录。您可以看到它在其中找到了一个javascript文件,“collection.js”. If you open it up 在 a text editor, the 找One() 功能 is listed:

此代码也可以在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 at the 至 p 在 stead:

  1. 获取查询返回的记录数(存储在total_records中)
  2. 生成一个介于1到计数之间的随机数(存储在randomNumber中)
  3. 再次使用该数字作为跳过查询(存储在光标中)

在JavaScript中生成范围内的随机数有点晦涩难懂,但我在StackOverflow上找到了一个有用的技巧来做到这一点: http://stackoverflow.com/a/7228322一行。一世’m 采用 d 至 蟒蛇 ’s ultra simple 随机 .randrange().

让’首先测试一下。您’我会注意到所有代码都可以在mongo中返回’s javascript 贝壳 :

您实际上可以在终端中实时替换此代码,尽管它赢得了’t be saved 上 ce you close it. Try first replacing 找One with a 你好,世界:

您可以先在终端中通过复制第一个等号之后的所有内容来测试我们的新功能。打开mongoDB 贝壳 到您喜欢的数据库并输入 D b .我的收藏.找One =然后粘贴函数。尝试调用它,它每次应返回不同的结果。

让’s补丁mongodb现在具有我们的功能。我们必须从刚刚下载的源代码编译mongo。

  1. Save the 采集.js 文件 you just edited with the new 找Another() 功能
  2. 确保已安装C ++编译器。一世’m使用gcc(已使用  酿造 安装 海湾合作委员会
  3. 检查您的处理器有多少个内核。根据Google的说法,我的2.7 GHz Intel i5有4个内核。
  4. 在同一终端窗口中(仍在mongo文件夹中),键入: 坏话 -j4 蒙哥 并按Enter键。的 4这是我拥有的内核数量,并会认真地加快速度。 坏话 是处理编译和放置的程序 蒙哥 最后,我们只想打补丁mongo’s client.

您’当scons检查所有内容时,会看到大量绿色文本,然后:

它编译了!现在,我们必须用修改后的版本替换现有的mongo应用程序。让’s do a unix 找:

我们要替换/ usr / 本地 / 地窖 /中的mongo应用程序(brew安装到的位置)。让’将其备份,然后复制:

现在,打开一个MongoDB 贝壳 到您喜欢的数据库:

注意事项:

  • 这可能真的很慢,因为它必须运行两次查询。但是,通常我不’t add super taxing queries 至 找One().
  • 如果使用brew重新安装/升级mongo,则可能会替换此功能–他们相当频繁地发布新版本。

改进措施

  • 该函数的作用类似于python生成器,保持状态并向前循环直到到达记录集的末尾。这将解决上面的任何缓慢问题,但随机性会降低。

MongoDB 阿司匹林

基本上,这是我使用Mongo时遇到的常见错误/任务/问题列表。一世’我记下了通常有效的方法。可能是你’ll 找 it 采用 ful 🙂

为什么我的远程mongodb连接被拒绝了?

    • 删除 蒙哥 .从您的主要mongodb存储文件夹中选择文件,然后重新启动[ 所以 ]
    • 如果使用redhat,请检查  塞斯塔图斯
    • 修改 / 等等 /系统配置/iptables 按照以下说明具有正确的防火墙规则 蒙哥 b 文档.

您如何在pymongo中遍历所有mongoDB集合? 

我通常将集合作为对象属性来访问,例如:  康恩 .数据库.采集.找_one()但实际上,数据库和连接也可以作为字典中的键来访问:

为什么mongod每当我关闭外壳时都会终止?即使使用 &最后

启动mongod时,请使用 蒙哥 - 叉子 Â(注意:fork必须在mongod一词之后),它将作为后台进程启动。或者只是添加 叉子 = 真正 到您的配置。

我刚刚创建了一个经过身份验证的数据库,并且可以’t even 采用 节目 数据库 一种 !

创建具有以下所有4个权限的新用户:userAdminAnyDatabase,readWriteAnyDatabase,dbAdminAnyDatabase,clusterAdmin: