2016-03-28 43 views
0

次のシナリオから結果を取得しようとすると、セレクタまたはビューのどちらを使用するか、またはその両方を使用するか混乱しています。Cloudantでセレクタまたはビューを使用する必要がありますか?

書籍のワイルドサーチを行い、店舗名の価格と詳細。

だから、私は結果を得ることができていた正規表現

"selector": { 
       "_id": { 
       "$gt": null 
       }, 
       "type":"product", 
       "product_name": { 
       "$regex":"(?i)"+search 
       } 
      }, 
      "fields": [ 
       "_id", 
       "_rev", 
       "product_name" 
      ] 

を使用してwildsearchを行うには、セレクタを使用してみました。結果を得た後のアイデアは、結果セットのすべての_idを使用してビューにクエリを実行して、価格などの詳細を取得し、ブランチ名を他のドキュメントに格納することです。これは奇妙なことです。それを行う正しい方法。

以下は、_idの結果を取得し、それを「productId」変数として挿入した場合のアイデアです。

var input = { 
     method : 'GET', 
     returnedContentType : 'json', 
     path : 'test/_design/app/_view/find_price'+"?keys=[\""+productId+"\"]",  

       }; 
       return WL.Server.invokeHttp(input); 

ので、私はこれについて、専門家からの入力を求めています。

もう1つの質問はstore_branch_nameを取得する方法です。製品の詳細、価格、店舗名を入手できる単一のビューで行うことはできますか?または、これを達成するためにいくつかのビューを用意する必要がありますか?

期待される結果

product_name (from book document) : Book 1 
branch_name (from branch array in Store document) : store 1 branch one  
price (from relationship document) : 79.9 

参考文献:

ブック

"_id": "book1", 
    "_rev": "1...b", 
    "product_name": "Book 1", 
    "type": "book" 

    "_id": "book2", 
    "_rev": "1...b", 
    "product_name": "Book 2 etc", 
    "type": "book" 

関係

"_id": "c...5", 
    "_rev": "3...", 
    "type": "relationship", 
    "product_id": "book1", 
    "store_branch_id": "Store1_branch1", 
    "price": "79.9" 
Cloudantクエリで

ストア

{ 
    "_id": "store1", 
    "_rev": "1...2", 
    "store_name": "Store 1 Name", 
    "type": "stores", 
    "branch": [ 
    { 
     "branch_id": "store1_branch1", 
     "branch_name": "store 1 branch one", 
     "address": { 
     "street": "some address", 
     "postalcode": "33490", 
     "type": "addresses" 
     }, 
     "geolocation": { 
     "coordinates": [ 
      42.34493, 
      -71.093232 
     ], 
     "type": "point" 
     }, 
     "type": "storebranch" 
    }, 
    { 
     "branch_id": "store1_branch2", 
     "branch_name": 
     **details ommit...** 

    } 
    ] 
} 

答えて

2

、あなたは、インデックスの2種類を指定することができ、それは両者の違いを知っておくことが重要です。

Cloudant Queryの$regex演算子をそのようなワイルドカード検索に使用している場合は、"json"の代わりに"text"タイプのCloudant Queryインデックスを作成した方がよい場合があります。それはCloudantドキュメントにだが、詳細については、イントロのブログ記事を参照してください。https://cloudant.com/blog/cloudant-query-grows-up-to-handle-ad-hoc-queries/インデックスhttps://cloudant.com/blog/mango-json-vs-text-indexes/

それは理解せずにあなたの質問の後半部分に対処するために難しくなって二種類の間のトレードオフをカバーし、この上の、より高度なポストがありますアプリケーションがどのようにデータとやりとりをしているのか、いくつかのアドバイスがあります。

1)この情報の一部を非正規化することを検討してください。最初にJOINを実行しないようにしてください。

2)ドキュメントキーにさらに多くのロジックを注入し、従来のMapReduce Viewインデックスシステムを使用してCouchDB/Cloudantインデックスソートを利用してJOINをエミュレートするために使用できる複合キー(配列)を生成します。ルール

秒1は一口だが、YouTubeでこの例をチェックアウト:https://youtu.be/0al1KnCKjlA?t=23m39s

は、ここで私が話している内容のプレビュー(例えば、マップ機能)です:

'map' : function(doc) 
    { 
     if (doc.type==="user") { 
       emit([doc._id], null); 
     } 
     else if (doc.type==="edge:follower") { 
      emit([doc.user, doc.follows], {"_id":doc.follows}); 
     } 
    } 

たセカンダリインデックスここではhttp://wiki.apache.org/couchdb/View_collationで概説されたルールを利用します。文字列は配列の前にソートされ、配列はオブジェクトの前にソートされます。次に、範囲問合せを発行して、JOINで取得する結果をエミュレートできます。

私はそれがここで適切だと思います。それが役に立てば幸い!

+0

お返事ありがとうございました。返信いただきありがとうございました。おそらく私の解説で何をしようとしているのか分かりません。要約すると、私は店の支店と価格で本のリストをリストしたいだけです。上記の文書と一緒に。私は実際に店舗を非正規化し、1つの文書にそれらを組み合わせることで支店を保管しています。残りの部分は私が再びそれを非正規化できるとは思わない。 – kkurni

+0

2番目の質問に関して、私は実際には単一のクエリでストアブランチIDを参照するのが難しいです。 product_id、store_branch_id、および価格を持つ私の "Relationship"ドキュメント。問題は、Storeドキュメントのstore_branch_idをブランチ[]。branch_idで参照する方法がわからないことです。これは、ネストされたオブジェクトであるためです – kkurni

関連する問題