视图不会更新以添加以前被忽略的对象

View does not update to add object that was previously ignored

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

我的文档:

{
  "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));

我是否需要 运行 程序来以编程方式更新视图?

更新二:

问题是时差。添加文档时,视图未更新,因为日期条件不匹配。

但是,添加文档后即使满足视图条件,视图也不会更新。

例如:

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. 文档已添加到存储桶

  2. 视图引擎处理文档以确定它是否被添加到视图中。

  3. 如果满足一系列条件,如您的问题中所述,文档将添加到视图中。如果不是,则忽略该文档。具体来说,

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

  4. 如果稍后更新文档,视图将重新处理它,它可能会也可能不会被包含。

问题

存在一个基本问题,即 视图的编译与 视图的查询之间的区别。当您编译视图时,它需要包含您将来可能想要 select 的 所有可能的组合 。当您从视图中查询时,只会返回满足给定查询条件的项目。

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

解决方法

更改您的 map/reduce 函数以发出您想要的所有对象,删除对 Date.Now 的任何依赖。将您的查询代码更改为 select 仅匹配当前在您的查询中定义的给定条件的项目。

请注意,使用 java 代码执行粒度 selection 在将结果提供给客户之前。我发现这种方法具有极高的性能。