Cho phép nói rằng tôi có hai loại tài liệu được lưu trữ trong cơ sở dữ liệu CouchDB của tôi. Đầu tiên là loại thuộc tính được đặt thành liên hệ và thứ hai đến điện thoại. Loại tài liệu liên hệ có một thuộc tính khác được gọi là tên. Loại điện thoại có số thuộc tính và contact_id để có thể tham chiếu đến người liên hệ. Đây là một trong những kịch bản từ một đến nhiều khi một số liên lạc có thể có số điện thoại N (tôi biết rằng chúng có thể được nhúng trong tài liệu liên hệ duy nhất, nhưng tôi cần chứng minh một mối quan hệ với nhiều tài liệu khác nhau).Chế độ xem CouchDB soạn các đối tượng JSON với các mảng được nhúng từ hai tài liệu riêng biệt
dụ thô với Scott có 2 số điện thoại và Matt có 1 số:
{_id: "fc93f785e6bd8c44f14468828b001109", _rev: "1-fdc8d121351b0f5c6d7e288399c7a5b6", type: "phone", number: "123456", contact_id: "fc93f785e6bd8c44f14468828b00099f"}
{_id: "fc93f785e6bd8c44f14468828b000f6a", _rev: "1-b2dd90295693dc395019deec7cbf89c7", type: "phone", number: "465789", contact_id: "fc93f785e6bd8c44f14468828b00099f"}
{_id: "fc93f785e6bd8c44f14468828b00099f", _rev: "1-bd643a6b0e90c997a42d8c04c5c06af6", type: "contact", name: "Scott"}
{_id: "16309fcd03475b9a2924c61d690018e3", _rev: "1-723b7c999111b116c353a4fdab11ddc0", type: "contact", name: "Matt"}
{_id: "16309fcd03475b9a2924c61d69000aef", _rev: "3-67193f1bfa8ed21c68e3d35847e9060a", type: "phone", number: "789456", contact_id: "16309fcd03475b9a2924c61d690018e3"}
chức năng bản đồ:
function(doc) {
if (doc.type == "contact") {
emit([doc._id, 1], doc);
} else if (doc.type == "phone") {
emit([doc.contact_id, 0], doc);
}
}
Giảm chức năng:
function(keys, values) {
var output = {};
for(var elem in values) {
if(values[elem].type == "contact") {
output = {
"ID": values[elem]._id,
"Name": values[elem].name,
"Type": values[elem].type,
"Phones": []
};
} else if (values[elem].type == "phone") {
output.Phones.push({
"Number": values[elem].number,
"Type": values[elem].type
});
}
}
return output;
}
group_level được thiết lập để 1 vì các phím trong chức năng Bản đồ. Bây giờ tôi có thể nhận được liên lạc của tôi với điện thoại bao gồm ví dụ như thế này:
http://localhost:5984/testdb2/_design/testview/_view/tv1?group_level=1
Hoặc tìm kiếm đối với một số tiếp xúc với startkey và endkey như thế này:
http://localhost:5984/testdb2/_design/testview/_view/tv1?group_level=1&startkey=[%22fc93f785e6bd8c44f14468828b00099f%22]&endkey=[%22fc93f785e6bd8c44f14468828b00099f%22,{}]
Kết quả tìm kiếm chính xác làm thế nào tôi muốn - danh bạ sẽ có nhúng điện thoại theo một đến nhiều mối quan hệ. Và đây là câu hỏi: Đây có phải là cách thích hợp để sử dụng chức năng MapReduce trong CouchDB không? Có bất kỳ vấn đề hiệu suất đáng chú ý khi sử dụng phương pháp này không?
Nó được sắp xếp như vậy bởi vì khi tôi truy cập trực tiếp chế độ xem thông qua trình duyệt, tôi sẽ phải chèn giảm dần = true vào url. – yojimbo87