此版本的文档已存档,不再提供支持。要升级5.0部署,请参阅 MongoDB 6.0升级程序。
注意
作为 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)); } maporders使用collection中的单个文档调用 函数:var myDoc = db.orders.findOne( { _id: ObjectId("50a8240b927d5d8b5891743c") } ); map.apply(myDoc); 验证键/值对是否符合您的预期。
emit key: abc123 value:250 maporders使用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(); } 验证键和值对是否符合您的预期。
提示
map函数必须满足各种要求。 有关map函数的所有要求的列表,请参阅mapReduce或mongosh辅助方法db.collection.mapReduce() 。