如果另一方面它们不是一对一的,那么使用复杂键可以使用视图归类来进行联接。
function(doc) {
if (doc.type == 'order') {
emit([doc.cartid, 1], doc);
} else if (doc.type == 'cart') {
emit([doc.id, 0], doc);
}
}
该文档将通过Cartid进行整理,订单来自购物车之后。您的应用程序代码可以轻松加入此流,您可以使用startkey和endkey通过特定的cartid进行查询。
查看:View Collation查看排序规则。
您也可以使用reduce将它们连接在一起。
只要改变映射函数将此:
function(doc) {
if (doc.type == 'order') {
emit([doc.cartid, 1], {cartid: doc.cartid, orders: [doc]});
} else if (doc.type == 'cart') {
emit([doc.id, 0], {cartid: doc.id, orders: [], cart: doc);
}
}
,并添加减少功能是这样的:
function(keys, values) {
var out = {cartid: null, orders: [], cart: null};
for (idx in values) {
var doc = values[idx];
out['cartid'] = doc.cartid;
if (doc.cart) { out['cart'] = doc.cart };
for (idx2 in doc.orders) {
out.orders.push(doc.orders[idx2]);
}
}
return out;
}
这将每车返回一个文档,其中一个cartid,数组订购文件和购物车文件。
道歉,如果在上面的代码中有错误,但我没有一个方便的couchdb测试实例来试用它们。您应该了解一般想法,并且CouchDB维基有更多详细信息。