【发布时间】:2016-08-29 11:36:45
【问题描述】:
简介
我的收藏有超过 100 万份文档。每个文档的结构都是相同的,如下所示:
{_id: "LiTC4psuoLWokMPmY", number: "12345", letter: "A", extra: [{eid:"jAHBSzCeK4SS9bShT", value: "Some text"}]}
所以,如您所见,我的extra 字段是一个包含小对象的数组。我正在尝试尽可能多地插入这些对象(直到我接近 16MB 的文档限制)。这些对象通常出现在集合中最多文档的extra 数组中。所以我通常有数十万个相同的对象。
我在 extra 数组中的 eid 键上有一个索引。我使用这个创建了这个索引:
db.collectionName.createIndex({"extra.eid":1})
问题
我想计算集合中有多少 extra 字段对象。我正在这样做:
db.collectionName.find({extra: {eid: "jAHBSzCeK4SS9bShT"}}).count()
一开始,上面的查询很快。但是每当extra 数组变大一点(超过 20 个对象)时,它就会变得非常慢。
对于 3-4 个对象,它需要不到 100 毫秒,但是当它变得更大时,需要更多的时间。对于 50 个对象,需要 6238 毫秒。
问题
- 为什么会这样?
- 我怎样才能加快这个过程?
- 有没有其他方法可以更快地完成这个过程?
【问题讨论】:
-
考虑为“额外”创建一个索引。
-
@FelipeSulser 不幸的是,这是不可能的,因为索引键太大。
-
使用聚合是否会更快,因为我认为使用查找和计数不是正确的方法。例如 db.collectionName.aggregate({$group: {_id: "$extra.eid", count: {$sum:1}}});
-
@WhiteBullet 聚合比查找和计数要快,但不是那么多。
标签: arrays mongodb performance