Mat*_*att 14 database reduce couchdb join map
假设您有两种文档类型,客户和订单.一个客户文档包含如姓名,地址等和基本信息的订单包含所有的订单信息每次客户订单的东西.存储文档时,type = order或type = customer.
如果我在一组10个客户和30个订单上执行地图功能,它将输出40行.有些行是客户,有些是订单.
问题是,如何编写reduce,以便将订单信息"填充"在具有客户信息的行内?因此它将返回10行(10个客户),但每个客户的所有相关订单.
基本上我不想在输出上单独记录,我想将它们组合在一起(订单分成一个客户行)我觉得减少是这样的吗?
Jas*_*ith 30
这称为视图整理,它是一种非常有用的CouchDB技术.
幸运的是,你甚至不需要reduce一步.只是map用来让客户和他们的订单"聚集在一起".
关键是您需要为每个客户提供唯一的ID,并且必须从客户文档和订单文档中了解它.
客户示例:
{ "_id": "customer me@example.com"
, "type": "customer"
, "name": "Jason"
}
Run Code Online (Sandbox Code Playgroud)
示例顺序:
{ "_id": "abcdef123456"
, "type": "order"
, "for_customer": "customer me@example.com"
}
Run Code Online (Sandbox Code Playgroud)
我方便地使用客户ID作为文档,_id但重要的是两个文档都知道客户的身份.
目标是地图查询,如果您指定,?key="customer me@example.com"那么您将首先返回(1)客户信息,以及(2)放置任何和所有订单.
这个map函数会这样做:
function(doc) {
var CUSTOMER_VAL = 1;
var ORDER_VAL = 2;
var key;
if(doc.type === "customer") {
key = [doc._id, CUSTOMER_VAL];
emit(key, doc);
}
if(doc.type === "order") {
key = [doc.for_customer, ORDER_VAL];
emit(key, doc);
}
}
Run Code Online (Sandbox Code Playgroud)
所有行将主要对文档所关注的客户进行排序,并且"tiebreaker"排序是整数1或2.这使得客户文档始终排在其对应的订单文档之上.
["customer me@example.com", 1], ...customer doc...
["customer me@example.com", 2], ...customer's order...
["customer me@example.com", 2], ...customer's other order.
... etc...
["customer another@customer.com", 1], ... different customer...
["customer another@customer.com", 2], ... different customer's order
Run Code Online (Sandbox Code Playgroud)
PS如果您遵循所有这些:代替1并且2可能null为客户提供更好的价值,那么订单的订单时间戳.他们将像以前一样进行排序,除非您现在有按时间顺序列出的订单.