簡體   English   中英

MongoDB聚合比較:group(),$ group和MapReduce

[英]MongoDB aggregation comparison: group(), $group and MapReduce

關於何時使用group(),與$ group或mapreduce聚合,我有點困惑。 我在http://www.mongodb.org/display/DOCS/Aggregation上閱讀了針對group()的文檔, http: //docs.mongodb.org/manual/reference/aggregation/group/#_S_group for $ group ..分片是否group()不起作用的唯一情況? 另外,我覺得$ group比group()更強大,因為它可以與聚合框架中的其他管道運算符一起使用。$ group如何與mapreduce進行比較? 我在某處讀到它不生成任何臨時集合,而mapreduce則生成。 是這樣嗎?
有人可以提供插圖或指導我一起解釋這三個概念的鏈接,采用相同的樣本數據,以便我可以輕松地比較它們嗎?

編輯:
此外,如果您可以在新的2.2版本發布后指出這些命令中的任何新內容,那就太棒了。

這有點令人困惑,因為名稱相似,但group()命令是聚合框架中$group管道運算符的不同特性和實現。

group()命令,Aggregation Framework和MapReduce是MongoDB的統一聚合功能 功能有一些重疊,但我將嘗試解釋MongoDB 2.2.0中每個功能的差異和局限性。

注意:下面提到的內聯結果集指的是在內存中處理的查詢,並在函數調用結束時返回結果。 替代輸出選項(目前僅適用於MapReduce)可以包括將結果保存到新的或現有的集合。

group()命令

  • 用於分組的簡單語法和功能..類似於SQL中的GROUP BY

  • 返回結果集內聯(作為分組項的數組)。

  • 使用JavaScript引擎實現; 自定義reduce()函數可以用JavaScript編寫。

  • 目前的限制

    • 不會分組到超過20,000個鍵的結果集。

    • 結果必須符合BSON文件的限制(目前為16MB)。

    • 采用讀鎖定,並且在運行時不允許任何其他線程執行JavaScript。

    • 不適用於分片集合。

  • 另請參見: group()命令示例

MapReduce的

  • 實現MapReduce模型以處理大型數據集。

  • 可以從多個輸出選項中選擇一個(內聯,新集合,合並,替換,減少)

  • MapReduce函數是用JavaScript編寫的。

  • 支持非分片和分片輸入集合。

  • 可用於大型集合的增量聚合。

  • MongoDB 2.2實現了對分片地圖縮減輸出的更好支持。

  • 目前的限制

    • 單個發射只能容納MongoDB的最大BSON文檔大小的一半(16MB)。

    • 有一個JavaScript鎖,所以mongod服務器只能在某個時間點執行一個JavaScript函數。但是,MapReduce的大多數步驟都很短,因此可以經常產生鎖。

    • MapReduce函數可能很難調試。 您可以使用print()printjson()mongod日志中包含診斷輸出。

    • 對於試圖翻譯關系查詢聚合體驗的程序員來說,MapReduce通常不直觀。

  • 另請參見: Map / Reduce示例

聚合框架

  • MongoDB 2.2.0產品發布中的新功能(2012年8月)。

  • 旨在提高性能和可用性的具體目標。

  • 返回內聯結果集。

  • 支持非分片和分片輸入集合。

  • 使用“管道”方法,在對象通過一系列管道操作符(如匹配,投影,排序和分組)時進行轉換。

  • 管道運營商不需要為每個輸入文檔生成一個輸出文檔:運營商也可以生成新文檔或過濾掉文檔。

  • 使用投影,您可以添加計算字段,創建新的虛擬子對象,並將子字段提取到頂級結果中。

  • 可以根據需要重復管道運算符(例如,多個$project$group步驟。

  • 目前的限制

    • 結果以內聯方式返回,因此僅限於服務器支持的最大文檔大小(16MB)

    • 不支持與MapReduce一樣多的輸出選項

    • 僅限於聚合框架支持的運算符和表達式 (即無法編寫自定義函數)

    • 用於聚合的最新服務器功能,因此在文檔,功能集和使用方面有更多成熟空間。

  • 另請參見: 聚合框架示例

有人可以提供插圖或指導我一起解釋這三個概念的鏈接,采用相同的樣本數據,以便我可以輕松地比較它們嗎?

您通常不會找到比較所有三種方法都有用的示例,但以前的StackOverflow問題顯示了變化:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM