Java mongodb聚合长于distinct

Java mongodb聚合长于distinct,java,mongodb,Java,Mongodb,以下是我目前如何使用MongoDB聚合框架执行一项独特的操作: db.big.aggregate([ { "$project" : { "first_name" : "$first_name"}} , { "$group" : { "_id" : { "col1" : "$first_name"}}} , { "$limit" : 50000}]) 对于一个拥有200多万个文档的集合,大约需要3秒钟的时间。 如果我运行以下查询 db.big.distinct('first_name') 我得

以下是我目前如何使用MongoDB聚合框架执行一项独特的操作:

db.big.aggregate([ { "$project" : { "first_name" : "$first_name"}} , { "$group" : { "_id" : { "col1" : "$first_name"}}} , { "$limit" : 50000}])
对于一个拥有200多万个文档的集合,大约需要3秒钟的时间。 如果我运行以下查询

db.big.distinct('first_name')
我得到了几乎相同的结果,但不到1秒。 distinct的问题是我无法限制它,因此如果集合的属性有1M个distinct值,那么所有内容都将返回。 有没有一种方法可以使用distinct,因为它性能更高,但对返回的元素数量也有限制。
我使用的是MongoDB java驱动程序,因此我需要一个与之配合使用的解决方案。

因此我们需要在这里使用聚合框架

db.big.aggregate([{
            $group : {
                _id : '$first_name'
            }
        }, {
            $skip : 3
        }, {
            $limit : 5
        }
    ])

所以我们需要在这里使用聚合框架

db.big.aggregate([{
            $group : {
                _id : '$first_name'
            }
        }, {
            $skip : 3
        }, {
            $limit : 5
        }
    ])

首先,目前没有办法使用limit和distinct,如图所示

其次,独特的性能总是优于聚合框架。与仅检查不同的值相比,Bucketing/分组操作总是更为繁重

因此,只有一种方法可以加速聚合框架分组阶段,如下所示。也就是说,在对文档进行分组之前,先按分组键对文档进行排序,然后在排序键()上设置和索引


首先,目前没有办法使用limit和distinct,如图所示

其次,独特的性能总是优于聚合框架。与仅检查不同的值相比,Bucketing/分组操作总是更为繁重

因此,只有一种方法可以加速聚合框架分组阶段,如下所示。也就是说,在对文档进行分组之前,先按分组键对文档进行排序,然后在排序键()上设置和索引


db.big.distinct('first_name')。limit(x)?“first_name”有索引吗?若有,详情为何?。另一方面,SOR79限制不存在。distinct返回一个数组。@joao否我没有索引。请在此字段上创建索引,并检查聚合框架responsedb.big.distinct('first_name')。限制(x)?是否在“first_name”上有索引?若有,详情为何?。另一方面,SOR79限制不存在。distinct返回一个数组。@joao不,我没有索引。请在此字段上创建索引,并检查聚合框架响应。我知道,但我试图避免使用聚合。从我的测试来看,distinct似乎更快。我知道,但我正试图避免使用聚合。从我的测试来看,distinct似乎更快。为什么不在$sort之前运行$project呢
db.big.aggregate([{“$project”:{“first\u name”:1,“\u id”:0},{“$sort”:{“first\u name”:1},{“$group”:{“$first\u name”},{“$limit”:50000}])
为什么不在$sort之前运行$project
db.big.aggregate([{“$project”:{“first\u name”:1,“\u id”:0},{“$sort”:{“first\u name”:1},{“$group”:{“\u id”:“$first\u name”},{“$limit”:50000}])