在设计基础架构时,我希望将相当多的处理放入应用程序服务器而不是数据库服务器 - 因为我的应用程序服务器可以更容易地水平扩展。
因此,在考虑如何使用MongoDB时,我想知道MongoDB是否会利用客户端(应用服务器上的mongo-client)的计算能力而不是数据库服务器的计算能力。我想象这是沿着数据库服务器的行发送所有文件(可能是post index-lookup)到客户端,然后客户端将数据聚合到所需的结果。
我还没有找到任何文件确认这是否可行,虽然我读过似乎暗示所有聚合都在数据库服务器上完成。
所以我的问题是是否可以使用mongoDB 客户端来聚合数据,而不是mogoDB 服务器
答案 0 :(得分:0)
是的,聚合在服务器端完成,并在mongodb客户端执行聚合,您需要将所有数据从服务器带到客户端,然后处理它,带来大量数据可能非常慢,看看这个
这里它表示你可以在客户端进行聚合,但它没有说你如何做到这一点,我认为是从服务器端带来所有数据并将其存储在变量中然后使用聚合的JavaScript。
并检查出来,这可能也会有所帮助
https://groups.google.com/forum/#!topic/mongodb-user/UxUvgBTHnjM
答案 1 :(得分:0)
不要相信你能用当前版本的MongoDB做到这一点。聚合管道始终在mongod进程之上运行,这是在服务器上运行数据库软件的过程。以前有一个特殊情况 - 分片集合和数据库 - 将聚合管道分成两部分,然后在mongos进程中运行第二部分。如果仍然如此,您可以在应用程序服务器上运行mongos,并在应用程序服务器上运行至少部分聚合框架。
不幸的是,版本2.6中已更改 - 它现在在分片上运行,并且不使用mongos进程。来自文档:
汇总管道和分片集合
行为
在版本2.6中更改。
在分片集合上操作时,聚合管道是 分为两部分。第一个管道在每个分片上运行,或者如果是 早期的$ match可以通过使用分片键来排除分片 在谓词中,管道仅在相关分片上运行。
第二个管道由剩余的管道阶段和运行组成 在主要碎片上。主分片合并来自的游标 其他分片并在这些结果上运行第二个管道。该 主分片将最终结果转发给mongos。在以前 版本,第二个管道将在mongos上运行。 [1]直到所有 分片升级到v2.6,第二个管道运行在mongos上,如果有的话 碎片仍在运行v2.4。
所以你可以运行2.4版本并使用mongos进程 - 或者至少将一个分片保留为版本2.4并强制处理为mongos。