2013-05-14 39 views
22

在聚合函數中使用的$match運算符與Mongodb中的常規find有什麼區別?

爲什麼find函數不允許像集合函數那樣重命名字段名? 例如總的來說,我們可以通過以下字符串:

{ "$project" : { "OrderNumber" : "$PurchaseOrder.OrderNumber" , "ShipDate" : "$PurchaseOrder.ShipDate"}} 

但是,find不允許這樣做。

爲什麼總輸出不會返回爲DBCursor或List?也爲什麼我們不能計算返回的文件數量?

謝謝。

+0

[MongoDB的2.6聚合操作將返回一個光標](http://docs.mongodb.org/master/release-notes/2.6 /#聚集的操作,現在已經返回遊標)。 – vinipsmaker

回答

28

爲什麼聚合輸出不會返回爲DBCursor或List?

創建聚合框架是爲了解決簡單的問題,否則需要map-reduce。

該框架通常用於計算需要完整分貝作爲輸入並且文檔很少作爲輸出的數據。

聚合函數內部使用的$ match運算符和Mongodb中的常規查找有什麼區別?

就像你說的,差異之一就是返回類型。查找操作輸出返回爲DBCursor

其他方面的差異:

,也爲什麼我們不能得到返回的文件的數量?

你可以。僅計算元素的數量所得數組中或添加下面的命令到管道的末端:

{$group: {_id: null, count: {$sum: 1}}} 

爲什麼不查找功能允許重命名字段的名稱,如聚合函數?

MongoDB很年輕,功能還在。也許在未來的版本中,我們可以做到這一點。重命名字段在彙總比在找到更爲關鍵。

編輯(2014年2月26日):

MongoDB 2.6 aggregation operations will return a cursor

編輯(2014年4月9日):

MongoDB 2.6 was released with the predicted aggregation changes

+0

更新:在mongo 3.4中,您可以通過'{count:「number_of_elements」}合計數據' – Daniel

0

我調查了一些關於聚合和查找調用的內容: 我在160k文檔的表中以降序排序完成了此操作,並將我的輸出限制爲幾個文檔。

  1. Aggregation命令比find命令慢。
  2. 如果您訪問像ToList()這樣的數據,則聚合命令比查找更快。
  3. 如果你看的總次數(點1 + 2)的命令似乎等於

也許聚集自動調用ToList()而不必再調用它。如果您不打電話ToList()撥打find()電話會快得多。

7 [毫秒]對50 [毫秒](5個文檔)