如果另一方面它們不是一對一的,那麼使用複雜鍵可以使用視圖歸類來進行聯接。
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維基有更多詳細信息。