2014-09-18 23 views
7

在下面的查询限制之前数:施加限制之前如何获得在蒙戈聚合管道

db.orders.aggregate([{ $match : { status: "A"}, { $limit: 5} }]); 

我怎样才能得到藏品的数量?我仍然希望调用返回5个文档的数组。如果我使用$组,它似乎不会保留文档数组。这可以在一个电话中完成,还是必须打两个电话?

回答

3

不幸的是,现在您必须拨打两个电话,一个与您的结果的$限制运营商打电话,第二个电话拨打电话。你可以使用没有$ limit操作符和$ group操作符的聚合框架来计算一个计数,或者如wdberkeley指出的那样,如果你正在使用,你可以将你的标准传递给.count()来获得一个计数而不是使用聚合框架一个单一的比赛阶段。

请参阅MongoDB - Aggregation Framework (Total Count)

+1

使用[.count()](http://docs.mongodb.org/manual/reference/method/db.collection.count/)来计算结果总数。 – wdberkeley 2014-09-18 19:14:56

+0

@wdberkeley与聚合它不起作用。您必须拨打两个电话,如Brantino所述 – 1nstinct 2015-06-11 11:45:22

+0

请注意,如果您使用'.count()',则重复结果将被统计,可能已在您的聚合呼叫中由$ group消除。 – cib 2017-06-28 11:53:38

-1

另一种选择是限制应用程序层而不是Mongo查询中的结果。然后你可以计算完整的结果,你不必拨打两个电话。

例如,在Python中你会做:

data = db.orders.aggregate([{ "$match" : { "status": "A"} }])['result'] 
count = len(data) 
data = data[skip:skip+limit] 

如果你有一个大的数据集复杂的汇总调用,这是不是让两个电话显著更快。

+0

如果数据集非常大,则它可能不适合内存 - 这就是为什么您可以获取流式游标而不是将所有结果集加载到应用程序服务器内存中的原因。而且,执行数据库服务器的计数操作会节省您的应用程序服务器执行其他操作的时间。 – 2015-10-15 13:38:02