分片集群上的MongoDB skip()和limit()

时间:2019-05-04 12:02:42

标签: mongodb limit skip

如果我在分片的mongodb集群上运行以下查询,并且查询是分散/聚集类型。

find({"product": "laptop"}).sort({"year": 1}).skip(15).limit(5)

and和SKIP + LIMITS(组合)是否适用于mongos或单个分片(即mongod)?

或mongos将limit(20)发送到每个分片,即sum(skip + limit)以优化查询并随后应用 在返回客户之前先跳过(15).limit(5)到收集的结果

1 个答案:

答案 0 :(得分:0)

我想我找到了您疑问的答案。您可以阅读整个文档部分here,但您感兴趣的部分是这一部分:

  

mongos如何处理查询修饰符

     

排序

     

如果查询结果   未排序,mongos实例会打开结果游标,“   robins”是碎片上所有游标的结果。

     

限制

     

如果查询使用来限制结果集的大小   limit()游标方法,mongos实例将该限制传递给了   分片,然后将限制重新应用于结果,然后再返回   结果交给客户。

     

跳过

     

如果查询指定了许多记录,请使用   skip()游标方法,mongos无法将跳过传递给分片,   而是从分片中检索未跳过的结果,并跳过   组装完整结果时需要适当数量的文件。

     

limit()结合使用时,mongos将通过   限制加分片的skip()的值以改善   这些操作的效率。

如果您担心性能问题,那么最好的办法就是使用explain获取查询计划。在同一文档上,指定:

  

有关如何将聚合工作拆分的更多信息   分片群集查询的组件,请使用explain:true作为参数   转到aggregation()调用。返回将包括三个json对象。    mergeType 显示合并阶段发生的位置(“ primaryShard”,   “ anyShard”或“ mongos”)。 splitPipeline 显示您的哪些操作   管道在单个碎片上运行。 碎片显示每个作品   分片已完成。