在数组上使用count()时,MongoDB非常慢

时间:2016-05-04 07:11:43

标签: arrays mongodb performance

简介

我的收藏品有超过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毫秒。

问题

  1. 为什么会这样?
  2. 如何更快地完成此过程?
  3. 有没有其他方法可以完成此过程但速度更快?

1 个答案:

答案 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的查询构建器的一个怪癖。

除了索引整个子文档之外,我没有找到任何解决方案。