【发布时间】:2018-03-20 13:03:41
【问题描述】:
我正在使用 Mongodb 3.2.0 和聚合查询来通过“itemId”获取不同的“userId”。在我的收藏中,我有超过 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”设为 true。
查询执行超过 20 秒并给出结果。有没有其他方法可以提高执行速度?
我正在通过 NodeJS 本地 mongodb 驱动程序执行。使用不同的查询失败并显示“超过 16 MB 限制”。所以,我更喜欢使用“聚合”查询。
作为结果,总共有 600 000 个唯一用户 ID 作为 (ObjectId)。集合中可用的文件总数为 8 397 727。
【问题讨论】:
标签: mongodb mongoose mongodb-query aggregation-framework