Map 函数故障排除
在此页面上
注意
作为 Map-Reduce 替代方案的聚合管道
从MongoDB 5.0开始, map-reduce已弃用:
您应该使用聚合管道,而不是 map-reduce。聚合管道提供比 map-reduce 更好的性能和可用性。
对于需要自定义功能的 map-reduce 操作,可以使用
$accumulator
和$function
聚合操作符。可以使用这些操作符在 JavaScript 中定义自定义聚合表达式。
有关 map-reduce 的聚合管道替代方案的示例,请参阅:
聚合管道也比 map-reduce 操作更容易排除故障。
map
函数是一个JavaScript函数,它将值与键关联或“映射”,并在map-reduce操作期间发出键值对。
验证键值对
要验证map
函数发出的key
和value
对,请编写您自己的emit
函数。
考虑一个包含以下原型文档的collectionorders
:
{ _id: ObjectId("50a8240b927d5d8b5891743c"), cust_id: "abc123", ord_date: new Date("Oct 04, 2012"), status: 'A', price: 250, items: [ { sku: "mmm", qty: 5, price: 2.5 }, { sku: "nnn", qty: 5, price: 2.5 } ] }
定义
map
函数,将每个文档的price
映射到cust_id
,并发出cust_id
和price
对:var map = function() { emit(this.cust_id, this.price); }; 定义
emit
函数以打印键和值:var emit = function(key, value) { print("emit"); print("key: " + key + " value: " + tojson(value)); } map
orders
使用collection中的单个文档调用 函数:var myDoc = db.orders.findOne( { _id: ObjectId("50a8240b927d5d8b5891743c") } ); map.apply(myDoc); 验证键/值对是否符合您的预期。
emit key: abc123 value:250 map
orders
使用collection中的多个文档调用 函数:var myCursor = db.orders.find( { cust_id: "abc123" } ); while (myCursor.hasNext()) { var doc = myCursor.next(); print ("document _id= " + tojson(doc._id)); map.apply(doc); print(); } 验证键和值对是否符合您的预期。