另一方面,如果它们不是一对一的,那么使用复杂的键,您可以使用视图排序规则进行连接。
function(doc) {
if (doc.type == 'order') {
emit([doc.cartid, 1], doc);
} else if (doc.type == 'cart') {
emit([doc.id, 0], doc);
}
}
文档将由cartid 与购物车之后的订单进行整理。您的应用程序代码可以轻松加入此流,并且您可以使用 startkey 和 endkey 按特定 carid 进行查询。
请参阅:查看排序规则以了解排序规则。
您也可以使用 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);
}
}
并添加一个这样的reduce函数:
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;
}
这将为每个购物车返回一个文档,该文档将是一个购物车、一组订单文档和一个购物车文档。
如果上述代码中存在错误,我们深表歉意,但我没有方便的 couchdb 测试实例来试用它们。不过,您应该了解总体思路,CouchDB wiki 有更多详细信息。