2016-04-01 10 views
5

私は現在、電子商取引サイトのために今日のcouchbase 4.1を使用しているプロジェクトに取り組んでいます。Couchbase 4.5文書の返品

ウェブサイトのカテゴリ構造全体を単一のドキュメントとしてCouchbaseに保存し、特定のカテゴリを検索してそのカテゴリを返す場合や、カテゴリとその子カテゴリを返す場合があります。

この作業を効率的にするために配列インデクサーを使用しなければならないと確信していますが、私はCouchbaseにはかなり新しくなっていますので、どのように構造化するべきか(あるいはそれが可能であっても)私はID = 100を照会した場合、私は私の結果を持っていると思い

{ 
    "Categories": [ 
    { 
     "DisplayName": "Category One", 
     "Id": 1, 
     "Categories": [ 
     { 
      "DisplayName": "Child category", 
      "Id": 10, 
      "Categories": [ 
      { 
       "DisplayName": "Child child category", 
       "Id": 100, 
       "Categories": [ 
       { 
        "DisplayName": "Child child child category", 
        "Id": 1000 
       }, 
       { 
        "DisplayName": "Sibling child category", 
        "Id": 1001 
       }     
       ] 
      }, 
      { 
       "DisplayName": "Child", 
       "Id": 101, 
       "Categories": [ 
       { 
        "DisplayName": "Another child category", 
        "Id": 2001 
       } 
       ] 
      }    
      ] 
     } 
     ] 
    } 
    ] 
} 

:私の文書の

一部はこのようになります(構造の4つのレベルは約8-10トップレベルのカテゴリがあります)次のようになります。

{ 
    "DisplayName": "Child child category", 
    "Id": 100, 
    "Categories": [ 
    { 
     "DisplayName": "Child child child category", 
     "Id": 1000 
    }, 
    { 
     "DisplayName": "Sibling child category", 
     "Id": 1001 
    }     
    ] 
} 

場合によっては、私は子供を持つことを断っていません。配列(N1QL)を使用してクエリを作成して配列に選択しようとしましたが、複雑なオブジェクトのレベルを持つ場合でも可能かどうかはわかりません。

これがどのように可能であるかについて私にいくつかの指針を与えることができます(それは?)。私たちはCouchbase .NETクライアントを使用しています。

敬具マーティン

答えて

0

私は見つけることができる唯一のことは、(Couchbaseの4.5で最初に利用可能)subdocサブです:http://blog.couchbase.com/2016/february/subdoc-explained

+1

subdoc *可能性がありますが、クエリには適していません。あなたが望むパスを知る必要があります。 **を取得します。ただし、ルートオブジェクトがカテゴリごとに1つのエントリ(カテゴリIDである属性名)のdictionaryであるように文書構造を変更できる場合は、これが機能する可能性があります。 –

2

これは、クエリ使用すると、1つのドキュメント内のすべてのものを保存しようとしているので、面白いです、とその文書に入れる。 1つのアプローチがあります。

SELECT c.Id, c.DisplayName 
FROM default 
UNNEST (ARRAY cat FOR cat WITHIN Categories WHEN cat.Id IS NOT NULL END) AS c 
WHERE c.Id = 100; 

のサブカテゴリーに分類同上100を照会するには:

SELECT c.Id, c.DisplayName, c.Categories 
FROM default 
UNNEST (ARRAY cat FOR cat WITHIN Categories WHEN cat.Id IS NOT NULL END) AS c 
WHERE c.Id = 100; 

サブの唯一のレベルで分類同上100を照会するには、サブカテゴリーなしカテゴリー同上100を照会する

カテゴリ:

+0

本当によかったよ!私は朝起きて最初にそれを試してみよう!インデックスを作成して検索を高速化することは可能でしょうか?ドキュメントに何も見つかりませんでした。検索で何の答えも得られませんでした。 – Martin

+1

このためのインデックスを作成しようとしましたが、4.5ではできません。問題は、すべてのデータが単一のドキュメントにあることです。通常、インデックスから値をドキュメントにマップするので、適切なドキュメントにすばやくアクセスできます。あなたの場合は、ドキュメントの一部に到達するためのインデックスが必要であり、ドキュメント全体の処理を避けるために役立ちます。 4.5では本当にできません。 – geraldss

+0

もう1つの選択肢は、map-reduceビューを使用することです。 map-reduceビューは(Id、DisplayName、Categories)の各組み合わせを生成して格納し、指定したIdのビューを直接照会することができます。 map-reduceビューでCouchbaseのドキュメントを見ることができ、JavaScriptでemit()関数を書くことができます。 – geraldss