collection distinct 命令 (doc link) 返回一个变量,一个数组。此变量作为 BSON 文档发送,在 MongoDB 中最大大小限制为 16MB。
在某些情况下,将结果集保存在数组中很方便,但如果不确定它是否适合 16MB,那么您将无法使用它,正如您所发现的那样。
第 1 部分答案
相反,您可以 retrieve distinct values 在聚合命令中使用 $group 阶段。您也可以使用 MapReduce,但聚合具有更好的性能,因此我将重点介绍这一点。
db.myCollectoin.aggregate( [ { $group : { _id : "$myField" } } ] )
这会将结果从单个数组变量更改为游标,与普通查询/查找命令相同。因此,您在客户端迭代不同值的方式会有所不同,但您可以继续获取越来越多的值,直到游标完成。
无论您有集群、副本集还是独立的 mongod,都使用相同的命令。一个重要的性能考虑因素是明确分组的字段是否被索引,但正如您提到的,该字段是分片键中的前导字段,我们知道它是。
第 2 部分答案
是的,您可以对其进行排序。在 $group 之后添加 $sort 阶段。
db.myCollection.aggregate( [
{ $group : { _id : "$myField" } },
{ $sort: { "_id": 1 } }
] )
如果您必须从某个点再次重新启动查询,您可以添加 $match stage 作为聚合管道中的第一个操作。例如。 { $match: {"myField": { "$gt": "AbCdEf...."} } },
聚合新用户注意:上面$sort阶段的第二个“_id”是$group阶段输出的“_id”字段,即不同的“myField”值。它不是按基础集合中的“_id”值排序的。
如果您愿意,使用 $project 阶段可以重命名中间阶段的“_id”键名。
db.myCollection.aggregate( [
{ $group : { _id : "$myField" } },
{ $project : {
"_id" : false, /*stop it appearing as "_id" */
"myField" : "$_id" /*put original field name "myField" back on*/
} },
{ $sort: { "myField": 1 } }
] )