2016-04-15 9 views
1

私たちは、処理したいデータのリストを含むドキュメントストアとしてCloudantDBを使用しています。Cloudant(CouchDB)をドキュメントスタックとして扱うには?

実行時には基本的に1つのドキュメントを取得して処理し、正常に処理された場合はそのドキュメントをDBから削除します。

私が見る唯一のメカニズムは、文書のリスト全体(非常に大きなリストになる可能性があるため、私たちにはあまり役に立たないかもしれません)、または個々の文書にはID開始する必要はありません)。私が従来のSQLデータベースを扱っていた場合、ドキュメントを処理したいときにだけ前進するカーソルがあるかもしれません。

私はビューに精通していますが、私がここで役立つかどうかはわかりません。

いくつかのオプションがありません。

+0

以下の回答を参照してください。このようにすることを妨げる他の制約がある場合は、あなたの質問を更新してください。私は一見嬉しいです。 – markwatsonatx

答えて

4

Cloudantからドキュメントを取得するためのさまざまなオプションがあります。ビューは、ドキュメントのクエリ、並べ替え、集約を可能にする基盤技術です。あなたの特定の例では、最新のドキュメントを最大(または最小)にしたいと思うように思えます。ビューでこれを行うことができます。また、Cloudantでは単にインデックスを作成することもできます。

create_dateと呼ばれる日付フィールドがあるとします。

{ 
    "index": { 
    "fields": [ 
     "create_date" 
    ] 
    }, 
    "type": "json" 
} 

これは、ビューを作成し、あなたはそれが「デザインドキュメント」の下にリスト表示されます。Cloudantでは、(次の「ご利用可能なインデックス」にある編集をクリックし、クエリに行く)ので、同様にインデックスを作成することができます。ダッシュボードでそのビューを次のように照会することができます。

{ 
    "selector": { 
    "create_date": { 
     "$gt": 0 
    } 
    }, 
    "fields": [ 
    "_id", 
    "_rev" 
    ], 
    "sort": [ 
    { 
     "create_date": "desc" 
    } 
    ], 
    "limit": 1 
} 

メモ、私は1つのドキュメントに制限しています。これにより、Cloudantに追加された最新のドキュメントが返されます。 Cloudantに追加された最も古い文書を検索するには、ソートを"create_date": "asc"に変更します。

/db/_find/へのHTTP POST呼び出しを使用して、これをダッシュ​​ボードの外で実行できます。

https://docs.cloudant.com/cloudant_query.html#finding-documents-using-an-index

UPDATE:詳細については、こちらのリンクを参照してください使用して、テキストインデックスとブックマーク

上記のアプローチは、クエリを毎回各ドキュメントを削除し、再実行しようとしている前提としています。昇順ソートを使用した場合は、常にドキュメントを順番に処理しますが、降順ソートを使用した場合は、新しいドキュメントが挿入されるときに処理できます。

ブックマークを使用する方法もあります(下記のコメントのOPで提案されているように)。まず、Cloudantでテキストインデックスを作成します。

{ 
    "index": {}, 
    "type": "text" 
} 

上記と同じクエリを実行します。あなたは順番に書類を横断するブックマークを渡すことができ、その後のクエリで

{ 
    "docs":[{ 
    "_id":"aa279ae2835f51d8ea13ee3e6ae3a210", 
    "_rev":"1-e90f3814f49b3e89158f8d2337de89cb"} 
    ], 
    "bookmark": "g1AAAAD4eJzLYWBgYM5gTmHQSElKzi9KdUhJMtRLytVNSczRLS5JzEtJLEox1EvOyS9NScwr0ctLLckB6mBKUgCSSfb____PAvPdHK_uzd_TwMCQKJ1Fuml5LECSYQGQAhq4H2HiAWEHoIkKaCaaE23iAYiJ9xEmHhY7AHZjFgAnFk_X" 
} 

:結果は今、次のようなbookmarksフィールドが含まれますブックマークについて

{ 
    "selector": { 
    "create_date": { 
     "$gt": 0 
    } 
    }, 
    "fields": [ 
    "_id", 
    "_rev" 
    ], 
    "sort": [ 
    { 
     "create_date": "desc" 
    } 
    ], 
    "limit": 1, 
    "bookmark" : "g1AAAAD4eJzLYWBgYM5gTmHQSElKzi9KdUhJMtRLytVNSczRLS5JzEtJLEox1EvOyS9NScwr0ctLLckB6mBKUgCSSfb____PAvPdHK_uzd_TwMCQKJ1Fuml5LECSYQGQAhq4H2HiAWEHoIkKaCaaE23iAYiJ9xEmHhY7AHZjFgAnFk_X" 
} 

詳しい情報はここで見つけることができます:

https://docs.cloudant.com/cloudant_query.html#working-with-indexes

+0

ああ、うまくいくかもしれない。その例でどのようにブックマークを使用しますか?基本的には、すべてのドキュメントを1つずつパススルーするのに役立ちます。最後に何かを処理するためにクエリを再実行するだけで、新しい – RedBullet

+0

ブックマークはこの例では実際には動作しませんテキスト索引のみで動作します。理論的には、最も初期の文書から始める場合は、単純にそれぞれの文書を削除して同じクエリーを再発行すれば、いつも順番通りに行くことができます。ドキュメントを削除したくない場合は、ドキュメントをループする際にskipパラメータを追加することができます。ブックマーク付きのテキストインデックスを使用した例を試してみましょう。 – markwatsonatx

+0

ブックマークを使用して上記の例を追加しました。 – markwatsonatx

0

[OK]を、ここにあなたがやりたいことができる方法です。私が理解するように、あなたはおそらくフェッチできるという見解を持っています。

ビューに多くの重複キーがない場合は、問題ではありません。キーが重複している場合は、ビューから発行されたキーにdoc.idを追加できます。

あなたがしなければならないことは何らかのカーソルをすることです...リスト全体を取得することは明らかに良い考えではありませんが、2つのドキュメントを取得することはあまり面倒ではありません。

最初に、2つの最初のドキュメントを取得します。 2番目のドキュメントは、次のフェッチのためのポインタとして使用する必要があります。

ドキュメントを処理してcouchdbから削除します。 2番目に以前にフェッチされたドキュメントのキーを使用し、次のドキュメントをフェッチします。スキップ= 1を追加して、すでにフェッチしたドキュメントをフェッチしないようにすることができます。

http://url?start_key=previous_doc&limit=1&skip=1 
関連する問題