從http://docs.mongodb.org/manual/core/indexes/#multikey-indexes,可以使用多鍵索引在數組字段上創建索引。 http://docs.mongodb.org/manual/applications/aggregation/#pipeline-operators-and-indexes列舉了如何在聚合框架中使用索引的一些方法。但是,有時可能需要在陣列字段上執行$unwind
才能執行$group
。我的問題是,多鍵索引(或使用這種數組字段的任何索引)是否仍然可以在管道中間運行後使用?聚合流水線和索引
Q
聚合流水線和索引
6
A
回答
11
一般情況下,只可以展平到一個正常的查詢($match
,$limit
,$sort
和$skip
)管道運營商將能夠使用上收集的指標。這是操作員在2.4中添加的$geoNear
必須處於流水線開始的原因之一。
一旦您使用$project
,$group
或$unwind
變更文檔,索引不再有效/可用。
如果您在陣列字段上有索引,則仍然可以在$unwind
之前使用它,以加快文檔到流水線的選擇速度,然後再用第二個$match
優化所選文檔。
考慮像證件:
{ tags: [ 'cat', 'bird', 'blue' ] }
隨着tags
的索引。
如果你只是想組標籤與b
開始,那麼你可以像執行聚合:
{ pipeline: [
{ $match : { tags : /^b/ } },
{ $unwind : '$tags' },
{ $match : { tags : /^b/ } },
/* the rest */
] }
第一$match
確實使用上tags
指數的粗糧搭配。
$unwind
之後的第二個匹配項將無法使用索引(上面的文檔現在是3個文檔),但可以評估每個文檔以篩選出創建的額外文檔(要刪除{tags: 'cat'})。
HTH - Rob。
0
嗯@Rob確實得到正確的答案,但我看到他如何能導致你在錯誤的道路一點:如果你有一個數組中的一個索引,你仍可以前後使用
$展開以加速文檔到流水線的選擇,然後進一步優化選定的文檔。
基本上,例如他給出:
{ pipeline: [
{ $match : { tags : /^b/ } },
{ $unwind : '$tags' },
{ $match : { tags : /^b/ } },
/* the rest */
] }
將不使用多鍵索引過去$unwind
。因此,它將能夠搜索標籤名稱以b
開頭的所有ROOT文檔,但是它將無法使用$unwind
,然後使用索引過濾掉第二個$match
中的子文檔。
$match
只適用於突變前的索引。
所以基本上,一旦你已經改變了文檔並將其加載到管道上,那麼當前幾乎不可能使用索引。
相關問題
- 1. 流水線到索引
- 2. Elasticsearch通過子聚合流水線
- 3. ES流水線聚合 - 組合多個桶
- 4. 複合聚集索引和非聚集索引在sql server 2005
- 5. 聚集索引和非聚集索引
- 6. 聚簇索引和非聚簇索引
- 7. MongoDB流水線聚合將數值加起來
- 8. mongodb聚合框架流水線如何工作?
- 9. MongoDB聚合流水線過濾兩個陣列
- 10. 聚合物和谷歌索引
- 11. 聚合在多級索引
- 12. HTTP BOSH和HTTP流水線
- 13. 全文索引vs %%和聚簇索引
- 14. SQL空間索引和聚簇索引
- 15. 流水線工作流程和變量
- 16. Redis流水線
- 17. 在流水線
- 18. 與流水線
- 19. 流水線vs
- 20. Bitbucket流水線
- 21. PowerShell的流水線只返回集合
- 22. 主鍵和聚集索引
- 23. 「聚集索引」和「句序」
- 24. Apache Spark如何連接(多個)索引器和編碼器到流水線中
- 25. 火花流聚合
- 26. SQL Server中的複合聚集索引
- 27. python中的聚合數據框索引
- 28. 索引視圖與聚合表
- 29. mongodb聚合框架的索引優化
- 30. 流到mysql的流水線
感謝您的回答。然而,我發現「一旦你用......'$ unwind'改變文檔,那麼索引就不再有效了」與其他答案相矛盾。你能解釋這是爲什麼嗎? – MervS 2013-03-25 03:28:55
對不起,應該已經更清楚了。我會嘗試在一秒內編輯它,但第一場比賽使用索引,第二場比賽不會。 – 2013-03-26 00:23:04