分类档案: 的JavaScript

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 采用  酿造 安装 蒙哥 from the 自制程序包管理器 和git随附Mac上的XCode)

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

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

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

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

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

在JavaScript中生成范围内的随机数有点晦涩难懂,但我在StackOverflow上找到了一个有用的技巧来做到这一点: http://stackoverflow.com/a/7228322 in 上e line. I’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 =  然后粘贴功能。尝试调用它,它每次应返回不同的结果。

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

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

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

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

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

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

 Caveats:

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

改进措施

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

将HTML表转换为Excel下载HTTP响应:慢速OLAP DB连接的黑客

总览

善科 (“Good fox”日本)是一个报告系统(在这里查看Github上的代码) 一世 ’是在过去两周内在Mozilla创建的。基本上,我的非技术同事对Tableau感到非常沮丧(“INNER JOIN和OUTER JOIN有什么区别?”),我决定为他们创建一个简单的仪表板界面。

它是一个简单的引导程序前端,它包含数据库的活动统计信息 赞助瓷砖. 您 can drill down 至 每 tile or 客户/partner and pivot 通过 things like 本地e, 国家 and 日期.

善科’s堆栈(从高到低)

一项新功能

加载分析页面之一时,将显示一个表格。我的同事希望能够将数据下载到Excel。我想出了4种可能的方法来实现此目的:

  1. 只需重新运行查询,在后端将结果格式设置为csv,然后将其保存并在window.open()文件位置即可。
  2. 自动保存每个分析请求服务器请求中的数据,并定期清除旧文件。
  3. 使用像 ExcelBuilder
  4. Send the 数据 back 至 the server, 形成at it, and then back 至 the 客户 via an 如果rame

哪个是最佳解决方案?

  1. 这是有问题的,因为我们的重点是查询速度。 redshift数据库是一个 OLAP面向列的数据库和仅追加。这意味着添加数据的速度非常快,但是查询速度却很慢(通常超过6秒)。是的,它正在处理数十亿行这样令人难解的行,但是就等待这么长时间的用户体验而言并不是那么好。’如果他们已经有数据,则要再等待6秒钟重新运行分析。
  2. 听起来这可能最终会在客户端上存储大量数据,但是效果很好。在安全性方面,我’我不确定数据应该留在用户身上’不需要PC。
  3. 这没有’t work out so well –在Firefox中,文件命名错误。将来,我’d根据分析参数命名文件,例如<client>-<date>-<country>.xls
  4. This 是 the weirdest solution, but it works! 烧瓶 是 跑ning 本地ly so it 是 actually very fast. 那里 are no huge JQuery/JavaScript complications with 文件 permissions and the fact that you can manipulate the 数据 easily 上 the server 是 nice 至o.

解决方案4

该过程如下“Download 对于 Excel” button 是 clicked:

  1. 使用JavaScript引用HTML表并将其转换为数组数组
  2. 将iframe附加到DOM
  3. 将带有POST操作和隐藏字段的表单附加到iframe
  4. 将表内容插入隐藏字段’s value
  5. 提交表格
  6. 让 烧瓶 receive the POST 请求 and 形成at the 在formation 如 a CSV
  7. 返回带有包含CSV的文件附件的HTTP响应

让’s implement it

那里 were 变种ious ways 至 do 这个 在 JQuery with 可重复的.()  但我遇到了麻烦,仅使用.children引用细胞就容易得多。

然后,(本地运行中的)Flask将在以下位置接收POST请求: /download_excel . 让’s set up the 路线:

现在,当用户单击按钮时:

下载Excel链接

他们立即得到:

下载弹出窗口

对不起,我可以’无法显示Excel中的数据,因为数据不是’目前还没有公开。所有代码均可用 在github上!

然而,一件奇怪的事情是表格没有’t出现在检查器中(在Chrome或Firefox中):

在检查器中不可见

不过,您可以使用一些相当长的吸气剂来访问它:

why.jpg

未来功能 

  • 这些文件的名称可能比data.csv更直观–可能是网址中出现的各种情况的组合’s 询问 string
  • 可容纳超过6行的表格。使用不同的定界符(例如,“###”.
  • 如果有好处,请创建一个.xls文件而不是CSV文件

在Firefox扩展中使用Web 工人

Web 工人允许您在诸如Firefox之类的浏览器中在后台运行代码。这是将其构建到Firefox扩展中的方法,这与在页面上正常创建一个扩展略有不同。这样做的文档基本上不存在,所以希望您’ll 找 这个 采用ful.

请确保您具有与开发环境相似的开发环境 在我以前的帖子中描述过。

工人如何工作?

  • / 数据 /中的工作程序未直接连接到/ LIB /中的脚本
  • 但是,他们可以通过相互发送消息进行通信
  • 这些消息仅是文本,因此可以包含序列化的JSON,但仅此而已
  • 您’下面会注意到,我们基本上只是在两个脚本之间添加消息

工人的代码

导航到/ 数据 /目录并创建一个名为hello_world.js的文件

现在在其中粘贴以下内容(vim的新用户,请按 i  to start typing and 退出  followed 通过 :q  to save):

This says that whenever the 工人 receives a 信息 来自 客户, then send a 信息 back with the word “Hello” prepended.

这里的一个注意事项:在工人中,您可以’使用有用的功能  安慰.日志(“信息”) , 在stead 采用  倾倒(“信息”)

让’从主代码中调用工人

让’导航回到 /LIB/  folder and edit the 主要.js  文件,这是在扩展程序中运行的第一件事。

粘贴以下代码:

然后跑  cfx  . 您’会发现一个混乱的错误:

啊哈!这里的关键是:  ReferenceError: 工人 定义的 。这是因为Firefox扩展程序改用了ChromeWorker。我们需要将其粘贴在main.js中,方法是将其粘贴在顶部:

并将引用hello_world.js文件的行更改为调用ChromeWorker:

好吧让’尝试再次运行它!尝试  cfx  。 WTF另一个错误?

这里的关键是:  格式错误 脚本 URI: 你好,世界.js 。此隐秘错误是因为Firefox可以’尚未访问 /数据/  夹。我们必须使用SDK的另一部分来启用对其的访问。

打开 主要.js  并将其放在顶部:

现在我们可以使用该功能 .数据.网址() 。当您将文件名作为第一个参数时,它将返回一个字符串,例如  资源://jid1-zmowxggdley0aa-at-jetpack/test/data/whatever_file.js 在扩展名的情况下正确地引用它。修改工作程序导入行,如下所示:

现在让’使用以下命令再次运行扩展程序 cfx  :

是的,它有效!工人退回了消息“你好 马修“.

常问问题

  • 这是什么 {符号}  mean?

它的简写为:

基本上这意味着  要求(“铬”) 返回一个Object,我们只需要键引用的值“ChromeWorker”。这是从JavaScript对象提取内容的非常简洁的方式,将来会派上用场。

  • 为什么现在将Worker称为ChromeWorker?我们在用Google Chrome做些什么吗?

这是一个命名巧合,与浏览器中的Chrome无关。在这种情况下,Chrome指的是Firefox插件内部。