我正在使用带有聚合查询的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。
答案 0 :(得分:0)
可以尝试通过userId
itemId
并进行过滤
db.collectionName.distinct('userId',
{itemId: {$in: [ObjectId('59c0a50f6ca8a1545bf1d206'), ObjectId('59c0a50f6ca8a1545bf1d207')]}}
).length