2017-11-30 13 views
2

ドキュメントがバケットに挿入された後、表示されるドキュメントはありません。ビューは、以前に無視されたオブジェクトを追加するために更新されません。

マイドキュメント:

{ 
    "state": 1, 
    "rdbms_id": 0, 
    "startDate": 1511882685998, 
    "endDate": -1, 
    "type": "kv", 
    "userid": 1222, 
    "uuid": "84fd36ad-b8bd-4abb-90ac-eae407f9364a", 
    "amount": 1234, 
    "source_id": 12 
} 

ビューインデックスコード:

function (doc, meta) { 
    if(meta.type=="json"){   
    if(doc.type && doc.type === "kv"){  
     if(doc.startDate && doc.startDate<=Date.now()){ 
     if(doc.endDate && (doc.endDate>=Date.now() || doc.endDate==-1)){ 
      if(doc.state && doc.state==1){ 
      emit([doc.userid,doc.source_id], null); 
      } 
     } 
     } 
    } 
    } 
} 

マイビューのクエリ:カールとの文書を追加するとき

curl http://Administrator:[email protected]:8092/bss_write/_design/fihrist/_view/forUcrKVIds?limit=6&stale=false&connection_timeout=60000&inclusive_end=true&skip=0  

ビューが更新されます。

curl -H "Content-Type: application/json" -X POST -v -d 'Jsondocument' 'http://Administrator:[email protected]:8091/pools/default/buckets/bss_write/docs/kv-84fd36ad-b8bd-4abb-90ac-eae407f9364a' 

ただし、プログラムで追加するとビューが更新されません。

Cluster cluster = CouchbaseCluster.create("localhost"); 
cluster.authenticate("username", ""); 
Bucket bucket = cluster.openBucket("bss_write"); 

JsonObject doc = JsonObject.fromJson(Jsondocument); 

bucket.upsert(JsonDocument.create(type+"-"+uuid, doc)); 

プログラムでビューを更新する手順を実行する必要がありますか?

アップデート2:

問題は、時間差です。ドキュメントが追加されると、日付条件が一致しないためビューが更新されません。

ただし、ドキュメントの追加後にビュー条件が満たされてもビューは更新されません。例えば

My computer timestamp is 1512054982454. 
Couchbase server timestamp is 1512054876554. 

function (doc, meta) { 
    if(meta.type=="json"){   
    if(doc.type && doc.type === "kv"){  
---->if(doc.startDate && doc.startDate<=Date.now()){ //This returns false. 
     if(doc.endDate && (doc.endDate>=Date.now() || doc.endDate==-1)){ 
      if(doc.state && doc.state==1){ 
      emit([doc.userid,doc.source_id], null); 
      } 
     } 
     } 
    } 
    } 
} 
+0

*これまでに*表示されませんか?それともすぐにはないのですか?カーカスベースのビューは、インデックスを再インデックスするために必要な時間のために、主データストアよりもかなり遅れていることがよくあります。 – theMayer

+0

私は長い間待っていますが、決して現れません。再索引付けは、ビューを削除して再作成することによってのみ実行されます。 – onder

+1

ああ、あなたが言っていることを理解していると思います。ビューを動的に更新したいと思っています。そのようなことは、オブジェクト自体に対応する更新なしには不可能です。 – theMayer

答えて

1

背景

ハイレベルから、ここで何が起こっているかを打破するのをしてみましょう:

  1. 文書はバケット
  2. に追加されます
  3. ビューエンジンはドキュメントを処理して、ドキュメントがビューに追加されるかどうかを判断します。
  4. 質問に記載されているように一連の条件が満たされている場合は、ドキュメントがビューに追加されます。そうでない場合、文書は無視されます。後日、文書が更新され、場合具体的には、

    if(doc.startDate && doc.startDate<=Date.now())

  5. 、そしてビューを再処理することと、それよく、または含まれないことがあります。

問題

基本的な問題が存在し、それはビューのコンパイルとビューからクエリとの間の区別です。ビューをコンパイルするときは、将来選択する可能性のあるすべての可能な組み合わせに含める必要があります。ビューから照会すると、指定された照会基準を満たす項目のみが戻されます。

ここでの問題は、ビューのコンパイル段階でクエリ段階が実行されていることです。コンパイルロジックはオブジェクトごとに1回実行され、オブジェクトが変更されたりビューを再計算するようにCBに指示しないかぎり、再度実行されません。コンパイルに最初の場所にオブジェクトが含まれていない場合、それは決してなりません。

ソリューション

Date.Now上の任意の依存関係を削除し、必要なすべてのオブジェクトを放出する機能を削減/あなたのマップを変更し

。クエリで現在定義されている特定の条件に一致する項目のみを選択するようにクエリコードを変更します。

結果をクライアントに提供する前にJavaコードを使用して、ビューの幅広いクエリの結果をWebサービスホストのメモリにロードする方が効率的かもしれないことに注意してください。私はこのアプローチの結果として非常に高いパフォーマンスを見出しました。

関連する問題