我在mongodb中有一个集合,我使用node.js对mongo db进行聚合查询。我的查询如下所示:
db.orders.aggregate([
{$match:{status:"A"}},
{$group:{_id:"$cust_id",total:{$sum:"$amount"}}}])
我的疑问是:
此管道的匹配阶段将在我的mongod分片
逐个分组将在mongos /node.js(application)图层上运行 或者在mongod层/数据库服务器上。
在node.js的上下文中对聚合pipleine内部的任何洞察都会有很大的帮助。
答案 0 :(得分:0)
问题的答案是:这取决于。
首先,它取决于您的MongoDB版本。其次,它还取决于您的分片键配置。 documentation on the aggregation framework for MongoDB v3.4 in conjunction with sharded collections对此主题并不完全详尽。但是,它明确指出:
如果管道以分片键上的精确$ match开头,则整个管道仅在匹配的分片上运行。以前,管道会被拆分,合并它的工作必须在主要的碎片上完成。
对于必须在多个分片上运行的聚合操作,如果是 操作不需要在数据库的主分片上运行, 这些操作会将结果路由到随机分片以合并 结果,以避免重载该数据库的主分片。该 $ out阶段和$ lookup阶段需要在数据库上运行 主要分片。
然而,这个网站上最有趣的声明可能就是这个:
要查看管道是如何拆分的,请在中包含explain选项 db.collection.aggregate()方法。
通过这种方式,您可以了解自己的具体情况。