视图不会更新以添加以前被忽略的对象
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);
}
}
}
}
}
}
背景
让我们从高层次分析一下这里发生的事情:
文档已添加到存储桶
视图引擎处理文档以确定它是否被添加到视图中。
如果满足一系列条件,如您的问题中所述,文档将添加到视图中。如果不是,则忽略该文档。具体来说,
if(doc.startDate && doc.startDate<=Date.now())
如果稍后更新文档,视图将重新处理它,它可能会也可能不会被包含。
问题
存在一个基本问题,即 视图的编译与 视图的查询之间的区别。当您编译视图时,它需要包含您将来可能想要 select 的 所有可能的组合 。当您从视图中查询时,只会返回满足给定查询条件的项目。
这里的问题是视图编译阶段正在执行查询阶段。每个对象的编译逻辑运行一次,并且不会再次运行,除非对象改变或者你告诉CB重新计算视图。如果您的编译首先不包含该对象,它永远不会。
解决方法
更改您的 map/reduce 函数以发出您想要的所有对象,删除对 Date.Now
的任何依赖。将您的查询代码更改为 select 仅匹配当前在您的查询中定义的给定条件的项目。
请注意,使用 java 代码执行粒度 selection 在将结果提供给客户之前。我发现这种方法具有极高的性能。
将文档插入存储桶后,视图中没有文档。
我的文档:
{
"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);
}
}
}
}
}
}
背景
让我们从高层次分析一下这里发生的事情:
文档已添加到存储桶
视图引擎处理文档以确定它是否被添加到视图中。
如果满足一系列条件,如您的问题中所述,文档将添加到视图中。如果不是,则忽略该文档。具体来说,
if(doc.startDate && doc.startDate<=Date.now())
如果稍后更新文档,视图将重新处理它,它可能会也可能不会被包含。
问题
存在一个基本问题,即 视图的编译与 视图的查询之间的区别。当您编译视图时,它需要包含您将来可能想要 select 的 所有可能的组合 。当您从视图中查询时,只会返回满足给定查询条件的项目。
这里的问题是视图编译阶段正在执行查询阶段。每个对象的编译逻辑运行一次,并且不会再次运行,除非对象改变或者你告诉CB重新计算视图。如果您的编译首先不包含该对象,它永远不会。
解决方法
更改您的 map/reduce 函数以发出您想要的所有对象,删除对 Date.Now
的任何依赖。将您的查询代码更改为 select 仅匹配当前在您的查询中定义的给定条件的项目。
请注意,使用 java 代码执行粒度 selection 在将结果提供给客户之前。我发现这种方法具有极高的性能。