如何在mongodb中使用使用超过16mb的复合索引的非重复计数

时间:2019-12-19 14:17:00

标签: mongodb

我有一个称为“会话”的表

在表中,我有两个字段是复合索引:

  • app(ObjectId)
  • udid(字符串)

我想计算一个特定应用程序中不同对象的数量。

我去的第一个方法是:

db.getCollection('sessions').distinct('udid', {"app" : ObjectId("...")}).length

我的问题是结果大于16mb,并且出现以下错误“差异太大,上限为16mb”

然后我尝试使用下一个解决方案:

db.getCollection('sessions').aggregate([
    {$match: {app: ObjectId('...')}},
    {$group:{_id: '$udid'}},
    {$count: 'id'}
])

问题在于,它没有使用复合索引,而是首先找到所有的$ match,然后才执行该组,因此没有对索引进行分组。 这使得该查询在需要花费50秒的300万个文档架构中非常慢。

如果有人能告诉我另一种方法来进行计数的话,那就太好了。

0 个答案:

没有答案