2016-10-20 4 views
0

これは私が現在行っている方法ですが、より良い(よりパフォーマンスが良いか簡単な)方法がありますか? Cloudantデシベルで配列プロパティに値が含まれている場合、クラウドデータベースからドキュメントを取得します

ドキュメント:

1 ..

{ 
    "_id": "someId", 
    "_rev": "someRev", 
    "title": "someTitle", 
    "parentDirectories": [ 
    '/', '/base_dir' 
    ] 
} 

2 ..

{ 
    "_id": "someId2", 
    "_rev": "someRev", 
    "title": "someTitle2", 
    "parentDirectories": [ 
    '/', '/base_dir' 
    ] 
} 

現在、私はこのCloudantviewを定義しているので、trueにinclude_docsパラメータを設定オブジェクト全体が返されます(これは必須です)。

function (doc) { 
    if (doc.parentDirectories) { 
    for (i = 0; i < doc.parentDirectories.length; i++) { 
     emit(doc.parentDirectories[i], {_id: doc._id}); 
    } 
    } 
} 
と使用 viewを呼ぶだろう。..

/<database>/_design/<design-doc>/_view/my_view?include_docs=true 

に設定keysパラメータの使用:['/']を、そのビューは、上記2つの文書を返します。

答えて

0

解決策は問題ありません。キーが配列のキーであるインデックスを作成することは、既知の値を含むドキュメントを取得するための完全な方法です。あなたは(include_docs=trueで)とにかく、クエリ時に文書全体を取得しているように、1回の小さな反復は、値としてnullを発するです:

function (doc) { 
    if (doc.parentDirectories) { 
    for (i = 0; i < doc.parentDirectories.length; i++) { 
     emit(doc.parentDirectories[i], null); 
    } 
    } 
} 

あなたはまた、あなたの文書のサブセットを発することができます:

function (doc) { 
    if (doc.parentDirectories) { 
    for (i = 0; i < doc.parentDirectories.length; i++) { 
     emit(doc.parentDirectories[i], doc.title); 
    } 
    } 
} 

は、より速い応答のためにinclude_docs = trueの使用を避けることができるという意味です。

+0

ドキュメント全体が必要な場合は 'emit(doc.parentDirectories [i]、doc)'を使ってドキュメント全体を出力することもできます。 'include_docs = true'を使ってドキュメントを読むよりもはるかに高速ですが、ディスク上のインデックスサイズ –

関連する問題