2013-07-25 39 views
7

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

+0

"wut wut this is awesome" <3 – garbados

Trả lời

5

Bí quyết với điều này là tránh xa suy nghĩ về JOIN. Các tài liệu được liên kết cung cấp cho bạn một kỹ thuật để lập chỉ mục một loại tài liệu dựa trên các thuộc tính của một tài liệu khác. Công cụ này sử dụng kết hợp hai tính năng:

  1. CouchDB cho phép bạn chỉ định include_docs = true khi cho phép bạn chỉ định trả lại tài liệu được lập chỉ mục cùng với kết quả xem.
  2. Bạn có thể yêu cầu CouchDB trả về BẤT CỨ tài liệu bằng cách chỉ định thuộc tính _id trong kết quả xem. Lưu ý rằng bạn vẫn có thể chỉ trả lại một tài liệu cho mỗi kết quả.

Như một ví dụ, cho phép nói rằng bạn có tài liệu

{ 
    "_id": "111", 
    "type", "shoe", 
    "sku": "656F-PINSEC12", 
    "shoe-color": "black/houndstooth", 
    "imageId": "222" 
} 

{ 
    "_id": "222", 
    "type": "image", 
    "full-images": ["http://www.someurl.com/full/656F-PINSEC12.jpg"] 
    "thumbnail-images": ["http://www.someurl.com/thumb/656F-PINSEC12.jpg"] 
} 

sau đó bạn có thể chỉ số hình ảnh bằng cách SKU sử dụng chức năng bản đồ:

function(doc) { 
    if(doc.type === "shoe") { 
     emit(doc.sku, {_id: doc.imageId }); 
    } 
} 

Đó là cũng quan trọng để nhận ra rằng chức năng bản đồ chỉ hoạt động trên bản gốc d ocument đã được lưu.

Tôi nghĩ trong ví dụ của bạn, tài liệu "mục danh mục" và "màu giày" là không cần thiết. Bạn có thể xác định hàm bản đồ để lập chỉ mục tài liệu "hình ảnh giày" và "kích thước giày" của SKU ví dụ:

function(doc) { 
    if(doc.SKU) { 
     emit(doc.SKU, null); 
    } 
} 

Giả sử này đã được gán cho cái nhìn "mục-chi tiết", truy vấn của bạn:

https://username.cloudant.com/test/_design/catalogue/_view/item-details?include_docs=true&key=%22656F-PINSEC12%22

nên trở

{ 
    "total_rows":2, 
    "offset":0, 
    "rows": 
    [ 
     { 
      "id":"7b547bae4ac911c6f05b97eba6cb355a", 
      "key":"656F-PINSEC12", 
      "value":null, 
      "doc":{ 
      "_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" 
      ] 
      } 
     }, 
     { 
      "id":"12b6289d558d7ceb5bef725091666ce5", 
      "key":"656F-PINSEC12", 
      "value":null 
      "doc":{ 
      "_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 
       } 
      ] 

     }  
    ] 
} 

Nếu bạn muốn kết hợp các kết quả vào một tài liệu JSON đơn, bạn có thể xem bằng cách sử dụng list function để tạo đầu ra JSON tùy chỉnh. Tuy nhiên, tôi không chắc chắn rằng bạn sẽ kiếm được nhiều. Có vẻ như bạn thường hay hơn với mô hình dữ liệu chi tiết hơn (ví dụ: mỗi kết hợp giày/kích thước có thể là tài liệu riêng) và sử dụng chức năng bản đồ để tổng hợp dữ liệu cho SKU nhất định.

+0

cảm ơn rất nhiều vì câu trả lời rất bổ ích. đã giúp rất nhiều. – tim

Các vấn đề liên quan