MongoDB学习七--MongoDB的Map-Reduce示例

In the mongo shell, the db.collection.mapReduce() method is a wrapper around the mapReducecommand. The following examples use the db.collection.mapReduce() method: Consider the following map-reduce operations on a collection orders that contains documents of the following prototype:

{
     _id: ObjectId("50a8240b927d5d8b5891743c"),
     cust_id: "abc123",
     ord_date: new Date("Oct 04, 2012"),
     status: 'A',
     price: 25,
     items: [ { sku: "mmm", qty: 5, price: 2.5 },
              { sku: "nnn", qty: 5, price: 2.5 } ]
}

db.orders.insert({"cust_id":"zhang1","order_date":new Date(),"status":'A',"price":25.23, items:[{size:"S",qty:20,price:2.5},{size:"X",qty:2,price:3.0}]})
db.orders.insert({"cust_id":"zhang2","order_date":new Date(),"status":'A',"price":25.23, items:[{size:"S",qty:20,price:2.5},{size:"X",qty:2,price:3.0}]})
db.orders.insert({"cust_id":"zhang3","order_date":new Date(),"status":'A',"price":25.23, items:[{size:"S",qty:20,price:2.5},{size:"X",qty:2,price:3.0}]})
db.orders.insert({"cust_id":"zhang4","order_date":new Date(),"status":'A',"price":25.23, items:[{size:"S",qty:20,price:2.5},{size:"X",qty:2,price:3.0}]})
db.orders.insert({"cust_id":"zhang5","order_date":new Date(),"status":'A',"price":25.23, items:[{size:"S",qty:20,price:2.5},{size:"X",qty:2,price:3.0}]})
db.orders.insert({"cust_id":"zhang6","order_date":new Date(),"status":'A',"price":25.23, items:[{size:"S",qty:20,price:2.5},{size:"X",qty:2,price:3.0}]})
db.orders.insert({"cust_id":"zhang7","order_date":new Date(),"status":'A',"price":25.23, items:[{size:"S",qty:20,price:2.5},{size:"X",qty:2,price:3.0}]})
db.orders.insert({"cust_id":"zhang8","order_date":new Date(),"status":'A',"price":25.23, items:[{size:"S",qty:20,price:2.5},{size:"X",qty:2,price:3.0}]})
db.orders.insert({"cust_id":"zhang9","order_date":new Date(),"status":'A',"price":25.23, items:[{size:"S",qty:20,price:2.5},{size:"X",qty:2,price:3.0}]})
db.orders.insert({"cust_id":"zhang10","order_date":new Date(),"status":'A',"price":25.23, items:[{size:"S",qty:20,price:2.5},{size:"X",qty:2,price:3.0}]})

Return the Total Price Per Customer

Perform the map-reduce operation on the orders collection to group by the cust_id, and calculate the sum of the price for each cust_id:

Define the map function to process each input document:

  • In the function, this refers to the document that the map-reduce operation is processing.
  • The function maps the price to the cust_id for each document and emits the cust_id andprice pair.
var mapFunction1 = function() {
                       emit(this.cust_id, this.price);
                   };

Define the corresponding reduce function with two arguments keyCustId and valuesPrices:

  • The valuesPrices is an array whose elements are the price values emitted by the map function and grouped by keyCustId.
  • The function reduces the valuesPrice array to the sum of its elements.
var reduceFunction1 = function(keyCustId, valuesPrices) {
                          return Array.sum(valuesPrices);
                      };
Perform the map-reduce on all documents in the  orders  collection using the  mapFunction1  map function and the  reduceFunction1  reduce function.
db.orders.mapReduce(
                     mapFunction1,
                     reduceFunction1,
                     { out: "map_reduce_example" }
                   )

This operation outputs the results to a collection named map_reduce_example. If themap_reduce_example collection already exists, the operation will replace the contents with the results of this map-reduce operation:


Calculate Order and Total Quantity with Average Quantity Per Item

In this example, you will perform a map-reduce operation on the  orders  collection for all documents that have an  ord_date  value greater than  01/01/2012 . The operation groups by the  item.sku  field, and calculates the number of orders and the total quantity ordered for each  sku . The operation concludes by calculating the average quantity per order for each  sku  value:

Define the map function to process each input document:

  • In the function, this refers to the document that the map-reduce operation is processing.
  • For each item, the function associates the sku with a new object value that contains thecount of 1 and the item qty for the order and emits the sku and value pair.
var mapFunction2 = function() {
                       for (var idx = 0; idx < this.items.length; idx++) {
                           var key = this.items[idx].sku;
                           var value = {
                                         count: 1,
                                         qty: this.items[idx].qty
                                       };
                           emit(key, value);
                       }
                    };

Define the corresponding reduce function with two arguments keySKU and countObjVals:

  • countObjVals is an array whose elements are the objects mapped to the grouped keySKUvalues passed by map function to the reducer function.
  • The function reduces the countObjVals array to a single object reducedValue that contains the count and the qty fields.
  • In reducedVal, the count field contains the sum of the count fields from the individual array elements, and the qty field contains the sum of the qty fields from the individual array elements.
var reduceFunction2 = function(keySKU, countObjVals) {
                     reducedVal = { count: 0, qty: 0 };

                     for (var idx = 0; idx < countObjVals.length; idx++) {
                         reducedVal.count += countObjVals[idx].count;
                         reducedVal.qty += countObjVals[idx].qty;
                     }

                     return reducedVal;
                  };
Define a finalize function with two arguments  key  and  reducedVal . The function modifies the reducedVal  object to add a computed field named  avg  and returns the modified object:

var finalizeFunction2 = function (key, reducedVal) {

                       reducedVal.avg = reducedVal.qty/reducedVal.count;

                       return reducedVal;

                    };
Perform the map-reduce operation on the  orders  collection using the  mapFunction2 , reduceFunction2 , and  finalizeFunction2  functions.

db.orders.mapReduce( mapFunction2,
                     reduceFunction2,
                     {
                       out: { merge: "map_reduce_example" },
                       query: { ord_date:
                                  { $gt: new Date('01/01/2012') }
                              },
                       finalize: finalizeFunction2
                     }
                   )
This operation uses the  query  field to select only those documents with  ord_date  greater than  newDate(01/01/2012) . Then it output the results to a collection  map_reduce_example . If the map_reduce_example  collection already exists, the operation will merge the existing contents with the results of this map-reduce operation.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值