View不会更新以添加先前被忽略的对象

时间:2017-11-30 07:15:45

标签: couchbase couchbase-view couchbase-java-api

将文档插入存储桶后,视图中没有文档。

我的文件:

{
  "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:pass@localhost:8092/bss_write/_design/fihrist/_view/forUcrKVIds?limit=6&stale=false&connection_timeout=60000&inclusive_end=true&skip=0    

使用curl添加文档时视图已更新。

curl -H "Content-Type: application/json" -X POST -v -d 'Jsondocument' 'http://Administrator:pass@localhost: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);
          }
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:2)

<强>背景

让我们从高层来分解这里发生的事情:

  1. 文档已添加到存储桶
  2. 视图引擎处理文档以确定它是否已添加到视图中。
  3. 如果满足一系列条件,请按照问题中的说明将文档添加到视图中。如果不是,则忽略该文档。具体来说,

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

  4. 如果稍后更新文档,则视图将重新处理,并且可能包含也可能不包括在内。
  5. 问题

    存在一个基本问题,即编译视图和查询视图之间的区别。编译视图时,需要包含您将来可能要选择的所有可能的组合。从视图查询时,只返回符合给定查询条件的项目。

    这里的问题是视图编译阶段正在执行查询阶段。编译逻辑对每个对象运行一次,除非对象发生更改或者告诉CB重新计算视图,否则不会再次运行。如果您的编辑首先不包含该对象,那么它永远不会。

    解决方案

    更改map / reduce函数以发出所需的所有对象,删除Date.Now上的所有依赖项。更改查询代码以仅选择与查询中当前定义的给定条件匹配的项目。

    请注意,将广泛的视图查询结果加载到Web服务主机的内存中可能更有效,使用Java代码在将结果提供给客户端之前执行粒度选择。我发现这种方法可以产生极高的性能。