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: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);
          }
        }
      }
    }
  }
}
4

1 回答 1

2

背景

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

  1. 将文档添加到存储桶

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

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

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

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

问题

存在一个基本问题,那就是视图编译和视图查询之间的区别。编译视图时,它需要包括您将来可能要选择的所有可能组合。当您从视图查询时,只有那些满足给定查询条件的项目才会被返回。

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

解决方案

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

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

于 2017-12-05T16:05:26.413 回答