将文档插入存储桶后,视图中没有文档。
我的文件:
{
"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);
}
}
}
}
}
}
答案 0 :(得分:2)
<强>背景强>
让我们从高层来分解这里发生的事情:
如果满足一系列条件,请按照问题中的说明将文档添加到视图中。如果不是,则忽略该文档。具体来说,
if(doc.startDate && doc.startDate<=Date.now())
问题
存在一个基本问题,即编译视图和查询视图之间的区别。编译视图时,需要包含您将来可能要选择的所有可能的组合。从视图查询时,只返回符合给定查询条件的项目。
这里的问题是视图编译阶段正在执行查询阶段。编译逻辑对每个对象运行一次,除非对象发生更改或者告诉CB重新计算视图,否则不会再次运行。如果您的编辑首先不包含该对象,那么它永远不会。
解决方案
更改map / reduce函数以发出所需的所有对象,删除Date.Now
上的所有依赖项。更改查询代码以仅选择与查询中当前定义的给定条件匹配的项目。
请注意,将广泛的视图查询结果加载到Web服务主机的内存中可能更有效,使用Java代码在将结果提供给客户端之前执行粒度选择。我发现这种方法可以产生极高的性能。