【问题标题】:Run map reduce for all keys in collections - mongodb为集合中的所有键运行 map reduce - mongodb
【发布时间】:2016-02-11 09:34:59
【问题描述】:

我在 mongodb 中使用 map reduce 来找出像这样的客户的订单数量

db.order.mapReduce(
    function() {
        emit (this.customer,{count:1})
    },
    function(key,values){
        var sum =0 ; 
        values.forEach(
            function(value) {
                sum+=value['count'];
            }
        ); 
        return {count:sum};
    },
    {
         query:{customer:ObjectId("552623e7e4b0cade517f9714")},
         out:"order_total"
    }).find()

这给了我这样的输出

{ "_id" : ObjectId("552623e7e4b0cade517f9714"), "value" : { "count" : 13 } }

目前它正在为一个关键的客户工作。现在我希望它为订单集合中的所有客户运行这个 map reduce 查询,并像这个单一输出一样为所有客户输出结果。有什么方法可以让所有客户按顺序进行操作吗?

【问题讨论】:

  • 删除“查询”。它正在选择一个客户。没有它,这将减少到每个客户一个结果。
  • 我删除了这个 { query:{customer:ObjectId("552623e7e4b0cade517f9714")}, out:"order_total"},现在它显示错误错误:断言失败:需要提供一个 optionsOrOutString,我有什么做错了吗?
  • 是的,我的错误我也删除了一部分,非常感谢哥们
  • 好吧,我确实说过删除“查询”而不是整个选项参数。 “out”是选项的必需键。所以只需删除“查询”和它的数据。另请阅读documentation。它确实是解释事物的最佳来源。

标签: mongodb mapreduce


【解决方案1】:

对这个简单的任务使用 map/reduce 有点像使用(相对较慢的)大锤来破解难题。 aggregation framework 基本上是为这种简单的聚合而发明的(并且可以为您做更多事情!):

db.order.aggregate([
    { "$group":{ "_id":"$customer", "orders":{ "$sum": 1 }}},
    { "$out": "order_total"}
])

根据您的用例,您甚至可以省略 $out 阶段并直接使用结果。

> db.orders.aggregate([{ "$group":{ "_id":"$customer", "orders":{ "$sum": 1 }}}])
{ "_id" : "b", "orders" : 2 }
{ "_id" : "a", "orders" : 3 }

请注意,对于非常大的集合,这很可能不合适,因为它需要一段时间(但它仍然应该比 map/reduce 操作更快)。

对于单个客户的订单数量,可以使用简单的查询,使用cursor.count()方法:

> db.orders.find({ "customer": "a" }).count()
3

【讨论】:

  • 尝试了同样的事情,但它给出了空结果,可能是什么原因
  • @user29578 请添加一些示例文档并使用编辑按钮将它们添加到您的问题中...
  • 我删除了这个 {"$out":"order_total"},它起作用了,不知道为什么 :)
  • @user29578 好吧,在我的机器上工作;)但是,您应该使用文档进行调查...
  • 如果你能提供帮助,还有一件事,如果我不想在整个订单集合上运行,而是只在我从这个查询 db.delivery.find({"status": "DELIVERED"},{order:1}).pretty() ,这给了我 { "order" : ObjectId("551be725e4b0d253d957ca62") } { "order" : ObjectId("551c5381e4b0df29878547e1") } { "order" : ObjectId( “551c8f8ae4b0ab335af6ab91”)}{“订单”:ObjectId(“551ca7ede4b0ab335af6ab95”)}{“订单”:ObjectId(“551cb00fe4b0ab335af6ab98”)}{“订单”:ObjectId(“551cbe20e4b0df29878547ed”)}
猜你喜欢
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-25
相关资源
最近更新 更多