Tôi là người mới khi nói đến CouchDB. Tôi đến từ thế giới .NET SQL Server.CouchDB: Liên kết tài liệu tham chiếu đến một loạt các loại tài liệu khác nhau
Trong lướt qua CouchDB Hướng dẫn dứt khoát, tôi giống như "wut wut this is awesome". Bây giờ tôi đang thử nghiệm một số trong những điều tôi đã học với hy vọng thực hiện nó trong thế giới thực.
Tôi vừa đăng ký tài khoản Cloudant một vài tuần trước và bắt đầu sử dụng tài khoản này cho một số thử nghiệm/học tập.
Trong rối tung với các tài liệu được liên kết, toàn bộ lý thuyết đằng sau trông đơn giản và cũng là ví dụ về phía trước eo biển trên internet. Tôi muốn lấy một số thông tin từ một tài liệu có một loạt các tài liệu được liên kết khác nhau, mà bản thân chúng có mảng tài liệu được liên kết. Giống như một máy chủ SQL đa tham gia nhiều đến nhiều bảng quan hệ. Bạn sẽ thấy mã dưới đây. Hy vọng nó có ý nghĩa.
Lấy ví dụ truy vấn SQL này. Giả sử rằng chỉ có một mục nhập trong mỗi bảng, chúng tôi sẽ lấy lại một bản ghi với tất cả các chi tiết cho một chiếc giày có sku đã cho. Nhưng nếu chúng tôi có nhiều cỡ giày, chúng tôi sẽ phải viết thêm một số mã.
select ci.sku
,sc.color
,ss.size
,si.url
from CatalogItem ci
join ShoeImages si
on ci.sku = si.sku
and ci.sku = '656F-PINSEC12'
join ShoeSizes ss
on ci.sku = ss.sku
join ShoeColors sc
on ci.sku = sc.sku
Tôi muốn CouchDB để trả lại JSON sau bởi SKU tại https://username.cloudant.com/test/_design/catalogue/_view/item-details?include_docs=true&key=%22656F-PINSEC12%22
{
"_id": "689fe6982f4d604541db67ee4050a535",
"_rev": "5-64b5ddd751c51aadfcef1962c2c99c16",
"type": "catalogue-item",
"sku": "656F-PINSEC12",
"upc": "8549875231",
"shoe-colors":
[
{
"color": "black/houndstooth"
"shoe-sizes":
[
{
"size": 5,
"IsSizeAvailable": true
},
{
"size": 6,
"IsSizeAvailable": true
},
{
"size": 7,
"IsSizeAvailable": true
},
{
"size": 8,
"IsSizeAvailable": true
},
{
"size": 9,
"IsSizeAvailable": true
},
{
"size": 10,
"IsSizeAvailable": true
},
{
"size": 11,
"IsSizeAvailable": true
},
{
"size": 12,
"IsSizeAvailable": true
},
{
"size": 13,
"IsSizeAvailable": true
},
{
"size": 14,
"IsSizeAvailable": true
}
],
"shoe-images":
[
{
"full-images":
[
"http://www.someurl.com/full/656F-PINSEC12.jpg"
],
"thumbnail-images":
[
"http://www.someurl.com/thumb/656F-PINSEC12.jpg"
]
}
]
}
]
}
Với các tài liệu và bản đồ sau/giảm:
//--catalog item
{
"_id": "689fe6982f4d604541db67ee4050a535",
"_rev": "5-64b5ddd751c51aadfcef1962c2c99c16",
"type": "catalogue-item",
"sku": "656F-PINSEC12",
"upc": "8549875231",
"shoe-colors": [
{
"_id": "bbbb92c3d61ed9f4f0e8111fb20fcf43",
"shoe-images": [
{
"_id": "7b547bae4ac911c6f05b97eba6cb355a"
}
],
"shoe-sizes": [
{
"_id": "12b6289d558d7ceb5bef725091666ce5"
}
]
}
]
}
//--shoe images
{
"_id": "7b547bae4ac911c6f05b97eba6cb355a",
"_rev": "4-4fde0cac1b4b8afc618bbba5b6669193",
"type": "shoe-images",
"sku": "656F-PINSEC12",
"color": "Black/Houndstoot",
"full-images": [
"http://www.someurl.com/full/656F-PINSEC12.jpg"
],
"thumbnail-images": [
"http://www.someurl.com/thumb/656F-PINSEC12.jpg"
]
}
//--shoe color
{
"_id": "bbbb92c3d61ed9f4f0e8111fb20fcf43",
"_rev": "2-e5d07c00a0261c231dd2be9b26a6c0dc",
"type": "shoe-color",
"sku": "656F-PINSEC12",
"color": "black/houndstooth"
}
//--shoe sizes
{
"_id": "12b6289d558d7ceb5bef725091666ce5",
"_rev": "2-192df709f9de1ef27e9e5f4404863bcc",
"type": "shoe-sizes",
"sku": "656F-PINSEC12",
"shoe-color": "black/houndstooth",
"shoe-sizes": [
{
"size": 5,
"IsSizeAvailable": true
},
{
"size": 6,
"IsSizeAvailable": true
},
{
"size": 7,
"IsSizeAvailable": true
},
{
"size": 8,
"IsSizeAvailable": true
},
{
"size": 9,
"IsSizeAvailable": true
},
{
"size": 10,
"IsSizeAvailable": true
},
{
"size": 11,
"IsSizeAvailable": true
},
{
"size": 12,
"IsSizeAvailable": true
},
{
"size": 13,
"IsSizeAvailable": true
},
{
"size": 14,
"IsSizeAvailable": true
}
]
}
//--map/reduce
{
"_id": "_design/catalog",
"_rev": "4-de5baf04b485768de12d78e5a0e5aa5e",
"views": {
"item": {
"map": "function(doc)
{
if (doc.type === 'catalog-item')
{
emit([doc.sku, doc], null);
if (doc.shoe-colors)
{
for (var sc in doc.shoe-colors)
{
emit([doc.sku, Number(sc)+1], {_id: doc.shoe-colors[sc]._id});
for (var si in doc.shoe-colors[sc].shoe-images)
{
emit([doc.sku, Number(si)+1], {_id: doc.shoe-colors[sc].shoe-images[si]._id});
}
for (var sz in doc.shoe-colors[sc].shoe-sizes)
{
emit([doc.sku, Number(sz)+1], {_id: doc.shoe-colors[sc].shoe-sizes[sz]._id});
}
}
}
}
}"
}
}
}
Có thể có một cách tốt hơn thực hiện điều này nhưng tôi muốn xem liệu có thể có một tài liệu có một mảng tài liệu được liên kết mà cũng có một mảng tài liệu được liên kết hay không. Nhưng bản đồ/giảm của tôi không trả lại bất cứ điều gì. Tất cả phải trả là:
{"total_rows":0,"offset":0,"rows":[
]}
Tôi đoán rằng ai đó sẽ không lưu trữ tất cả các thông tin về một tài liệu duy nhất bởi vì, nói rằng chúng ta thêm một kích thước chương trình mới hoặc đánh dấu kích thước giày như không có, điều này có nghĩa một sẽ phải trả lại tất cả các giá trị trước đó cho CouchDB chỉ để cập nhật một trường.
Hy vọng câu hỏi của tôi có ý nghĩa Oo__oO
"wut wut this is awesome" <3 – garbados