MongoDB使用聚合得到的总计数非常慢

时间:2017-10-09 10:37:03

标签: mongodb mongoose mongodb-query aggregation-framework

我正在使用带有聚合查询的Mongodb 3.2.0来获得总数不同的" userId" by" itemId"。在我的收藏中,我有超过2000万份文件。我的收藏中的文件如下所示。

{
    itemId : ObjectId('59c0a50f6ca8a1545bf1d206'),
    regionId : ObjectId('59c11af56ca8a1545bb32665'),
    userId : ObjectId('59c3cd626ca8a12e70866b0c')
  },
  {
    itemId : ObjectId('59c0a50f6ca8a1545bf1d206'),
    regionId : ObjectId('59c11af56ca8a1545bb32665'),
    userId : ObjectId('59c3cd626ca8a12e70865678')
  } 

从此,使用" itemId"作为我的选择器,我正在计算完全不同的" userId"该系列中有售。以下配置我在我的集​​合中用作索引。

db.items.endureIndex({"itemId" : 1})
db.items.endureIndex({"userId" : 1})

我的汇总查询是

db.items.aggregate([
    { $match: { itemId: { $in: [ ObjectId('59c0a50f6ca8a1545bf1d206'),  ObjectId('59c0a50f6ca8a1545bf1d207')] } } },
    { $group: { _id: "$userId"}},
    { $group: { _id: null, count : {$sum : 1}}}
    ])

我还给了" allowDiskUse"是的。

查询执行时间超过20秒并给出结果。还有其他方法可以提高执行速度吗?

我正在通过NodeJS本机mongodb驱动程序执行。使用不同的查询失败,使用"超过16 MB限制"。所以,我更愿意选择"聚合"查询。

结果总共有600 000个唯一的userId作为(ObjectId)。该系列的总文件是8 397 727。

1 个答案:

答案 0 :(得分:0)

可以尝试通过userId

获取不同的itemId并进行过滤
db.collectionName.distinct('userId', 
  {itemId: {$in: [ObjectId('59c0a50f6ca8a1545bf1d206'), ObjectId('59c0a50f6ca8a1545bf1d207')]}}
).length