简介
我的收藏品有超过100万份文件。每个文档的结构都是相同的,如下所示:
{_id: "LiTC4psuoLWokMPmY", number: "12345", letter: "A", extra: [{eid:"jAHBSzCeK4SS9bShT", value: "Some text"}]}
因此,正如您所看到的,我的extra
字段是一个包含小对象的数组。我试图尽可能多地插入这些对象(直到我接近16MB的文档限制)。这些对象通常出现在集合中大多数文档的extra
数组中。所以我通常有成千上万个相同的对象。
我在eid
数组中有extra
键的索引。我使用这个创建了这个索引:
db.collectionName.createIndex({"extra.eid":1})
问题
我想计算集合中存在多少个extra
字段对象。我是这样做的:
db.collectionName.find({extra: {eid: "jAHBSzCeK4SS9bShT"}}).count()
一开始,上面的查询非常快。但是每当extra
数组变得更大(超过20个对象)时,它就变得非常慢。
对于3-4个对象,它需要不到100毫秒但是当它变大时,需要花费更多的时间。有50个对象,需要6238毫秒。
问题
答案 0 :(得分:3)
我遇到了similar problem。我打赌你的查询没有达到你的索引。
你可以做一个解释(在Mongo shell中运行db.collectionName.find({extra: {eid: "jAHBSzCeK4SS9bShT"}}).explain()
)来确定。
原因是在Mongo中db.collectionName.find({extra: {eid: "jAHBSzCeK4SS9bShT"}})
与db.collectionName.find({"extra.eid": "jAHBSzCeK4SS9bShT"})
不同。第一个表单将不使用您的索引,而第二个表单将使用(作为示例,虽然这在您的情况下不起作用,因为您的子文档实际上是一个数组)。不知道为什么,但这似乎是Mongo的查询构建器的一个怪癖。
除了索引整个子文档之外,我没有找到任何解决方案。