MongoDB中$match聚合和find方法之间的区别是什么?

32

在MongoDB中,聚合函数内使用的$match操作符与普通的find有什么区别?

为什么find函数不允许像聚合函数那样重命名字段名?例如在聚合函数中我们可以传递以下字符串:

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

然而,find不允许这样做。

为什么聚合输出不能作为DBCursor或List返回?还有为什么我们无法获取返回的文档数量?

谢谢。


MongoDB 2.6 聚合操作将返回一个游标。请参阅:http://docs.mongodb.org/master/release-notes/2.6/#aggregation-operations-now-return-cursors。 - vinipsmaker
2个回答

33

为什么聚合输出不返回DBCursor或List?

聚合框架的创建是为了解决一些本来需要使用map-reduce来解决的简单问题。

这个框架通常用于计算需要整个数据库作为输入,但只有少量文档作为输出的数据。

Mongodb中聚合函数内使用的$match操作符和常规的find操作之间有什么区别?

其中一个区别,正如您所说的,是返回类型。查找操作输出返回作为DBCursor

其他区别:

  • 聚合结果必须小于16MB。如果您正在使用分片, 那么在第一个$group$sort之后,完整的数据必须在单个点上收集
  • $match的唯一目的是提高聚合功能,但它还有其他用途,例如提高聚合性能。

而且为什么我们不能得到返回的文档数量?

您可以。只需计算结果数组中的元素数量,或将以下命令添加到管道的末尾:

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

「为什么查找函数不允许像聚合函数一样重命名字段名称?」 MongoDB还很年轻,功能仍在发展。也许在未来的版本中,我们将能够这样做。在聚合操作中,重命名字段比在查找操作中更为关键。
编辑(2014/02/26):MongoDB 2.6聚合操作将返回一个游标
编辑(2014/04/09):MongoDB 2.6已发布,包含预测的聚合变化

1
更新:在Mongo 3.4中,您可以通过{$count:"number_of_elements"}在聚合中进行计数。 - Daniel

0

我对聚合和查找调用进行了一些调查:

  1. 聚合命令比查找命令慢。
  2. 如果您像 ToList() 这样访问数据,则聚合命令比查找命令更快。
  3. 如果您观察总时间(点 1 + 2),则这两个命令似乎相等。

也许聚合自动调用了 ToList(),因此不必再次调用它。如果您之后不调用 ToList(),则 find() 调用将会更快。

7 [毫秒] vs 50 [毫秒](5 个文档)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接