mongodb获取每个邮政编码中的订单数量

时间:2014-03-11 19:45:31

标签: ruby-on-rails mongodb

您好我们正在使用带有mongo的rails,我们有一个名为orders的集合,其中包含每个客户的特定邮政编码。我们想要检索每个邮政编码属于多少订单的计数以及它们最多出现的时间范围。

文档可以包含以下基本信息:

{"zip" : 60010,
 "order_time" : <whatever the time for the order is>
}

现在我使用ruby进行聚合:

coll_orders.aggregate([{"$group" => {"_id" => "$zip", "numOrders" => {"$sum" => 1}}}, {"$sort" => {"numOrders" => 1}}])

,结果如下:

{"_id" : 60010,
"numOrders" : 55
}

我的问题是如何在聚合中添加功能,以便我可以获得其他字段,其中显示订单何时发生的细分?基本上是一个结果文档,如:

{"_id" : 60010,
"numOrders" : 55,
"morning" : 25,
"afternoon" : 10,
"evening" : 20
}

编辑:拼写/错过报价

2 个答案:

答案 0 :(得分:1)

解决这个问题的最佳方法是使用$ project阶段分别计算和存储分钟,并使用它来分组。我在下面提供了一个示例查询,它将在shell中运行,仅用于计算早上的订单。您可以根据预期的结果进行扩展。

db.foo.aggregate( [ 
    { $project: {
        zip: 1,
        order_time: 1, 
        minutes: { $add: [
            { $multiply: [ { $hour: '$order_time' }, 60 ] }, 
            { $minute: '$order_time' } 
        ] } 
    } },
    { $group: {
         _id:"$zip", 
         numOrders:{$sum:1}
         morning:{$sum:{$cond:[{$lt:["$minutes",12*60]}, 1, 0]}}}}
] );

答案 1 :(得分:0)

您可以使用以下mongoid查询来获取所需的数据:

计入每个邮政编码: Order.where(:zip => zip).count

对于给定时间段内的计数(您需要为每个时段创建单独的查询 - 上午,下午等):

Order.where(:zip => zip, :order_time => {'$gt' => start_time, '$lt' => end_time}).count

您可以将每个唯一的邮政编码插入一个单独的集合中以获取所有邮政编码的列表,或者如果您不经常运行此任务(并且您的收藏很小),您可以获得一个列表您收藏中的所有唯一邮政编码:

zips = Order.all.map{|o| o.zip}.compact.uniq

并迭代此数组并执行上述查询。