3

给定以下数据:

{
  _id: ObjectId("51659dc99d62eedc1a000001"),
  type: "image_search",
  branch: "qa_media_discovery_feelobot",
  time_elapsed: 19000,
  test: "1365613930 All Media",
  search_term: null,
  env: "delta",
  date: ISODate("2013-04-10T17:13:45.751Z")
}

我想运行如下命令:

avg_image_search_time = @coll.find("type" => "image_search").avg(:time_elapsed)

我将如何做到这一点?

4

2 回答 2

2

我知道这方面的文档很难理解。

avg_image_search_time = @coll.aggregate([ {"$group" => {"_id"=>"$type", "avg"=> {"$avg"=>"$time_elapsed"}}}, {"$match" => {"_id"=>"image_search"}} ]).first['avg']

要打破这一点:

我们按type字段对匹配项进行分组,并返回$avg每种类型的 time_elapsed。我们将得到的平均值命名为avg。然后,在这些组中,仅过滤掉组 _id 匹配的组image_search。最后,由于聚合总是返回一个数组,所以获取第一个结果(应该只有一个),然后获取avg我们命名的字段。

于 2013-04-10T20:19:42.527 回答
1

使用 mongodb 聚合框架 http://docs.mongodb.org/manual/core/aggregation/

于 2013-04-10T19:45:33.707 回答