2016-05-04 28 views
1

介紹MongoDB的陣列上使用COUNT()時

我收藏有超過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 Field對象存在的集合中有多少。我正在通過使用這樣做:

db.collectionName.find({extra: {eid: "jAHBSzCeK4SS9bShT"}}).count() 

在開始時,上面的查詢是非常快的。但是每當extra數組變大一點(超過20個對象)時,它變得非常慢。

3-4對象,只需不到100毫秒,但是當它變得更大,它需要更多的時間。有50個物體需要6238毫秒。

問題

  1. 這究竟是爲什麼?
  2. 如何使此過程更快?
  3. 有沒有其他方式可以做到這一過程,但速度更快?
+0

考慮爲「額外」創建一個索引。 –

+0

@FelipeSulser不幸的是,這是不可能的,因爲索引鍵太大。 – stackyname

+0

以更快的速度使用聚合工作,因爲我不認爲使用find和count是正確的方法。例如: db.collectionName.aggregate({$ group:{_id:「$ extra.eid」,count:{$ sum:1}}}); –

回答

3

我遇到了一個similar problem。我敢打賭你的查詢沒有打你的索引。

你可以做一個解釋(在蒙戈shell中運行db.collectionName.find({extra: {eid: "jAHBSzCeK4SS9bShT"}}).explain())肯定知道。

的原因是,在蒙戈db.collectionName.find({extra: {eid: "jAHBSzCeK4SS9bShT"}})是不一樣的db.collectionName.find({"extra.eid": "jAHBSzCeK4SS9bShT"})。第一種形式不會使用您的索引,而第二種形式(例如,雖然這不適用於您的情況,因爲您的子文檔實際上是一個數組)。不知道爲什麼,但這似乎是Mongo查詢構建器的一個怪癖。

我沒有找到除索引整個子文檔的任何解決方案。

+0

哇,我不知道。非常感謝!第二個查詢速度快一倍。你說得對,首先不使用索引。你說第二個查詢不適合我;但它的工作原理。我錯過了什麼嗎? – stackyname

+0

它很棒,如果它的工作!我只是不確定,因爲我只在子數據文件上使用了非數組的語法。可以肯定的是,你可以運行'explain()'並確保它使用索引。很高興它的運行速度更快:-) FWIW,我仍然不確定這種行爲是有意的還是一個錯誤... – Hashcut

+0

它的效果非常好!是的,我使用'explain()'來檢查索引使用情況,只有第二個顯示它正在被使用。我重新設計了'extra'字段,它現在包含更復雜的對象。我爲每個文檔和第一個查詢插入了70個對象(不使用索引),count在第二個查詢(使用索引)時花費了7357毫秒,count只花了104毫秒。 我希望這不是一個錯誤:) 再次感謝! – stackyname