Java Couchbase-创建视图并立即访问其数据
假设我需要一个(自动)升级脚本,如果<0,它将重置所有用户的余额 我想运行一个java代码,它:Java Couchbase-创建视图并立即访问其数据,java,view,couchbase,Java,View,Couchbase,假设我需要一个(自动)升级脚本,如果
Eyal我很乐意回答我自己的问题,希望它能帮助其他人 1.
要在“生产模式”中创建视图,您可以使用任何名称创建它,但名称必须以“dev_”(!)开头——我没有找到任何关于这个小技巧的适当文档
这就是你的代码:
// Production Mode Design Doc - no dev_ prefix in name!
DesignDocument designDoc = new DesignDocument("Users"); // not "dev_Users" !
ViewDesign viewDesign = new ViewDesign("NegativeBalance", mapFunction);
designDoc.getViews().add(viewDesign);
cbClient.createDesignDoc(designDoc);
2.
适用于couchbase 3.0及更新版本
为确保查询视图并等待所有结果,请将视图的stale属性设置为FALSE
View view = client.getView("Users", "NegativeBalance"); // production Design Doc
Query query = new Query();
query.setStale(Stale.FALSE); // Read all data
这非常有效(是的,stale=FALSE是一个性能打击)
适用于Couchbase 2.x及以上版本
您的更新需要使用stale=FALSE和PersistTo标志
client.ExecuteStore(StoreMode.Set, key, val,
Couchbase.Operations.PersistTo.One,
Couchbase.Operations.ReplicateTo.Zero);
希望能有帮助
EyalStale==False将只索引磁盘上的数据,视图中不会拾取任何尚未持久化的写入/突变。非常重要的注释@scalabilitysolved,谢谢--我将更新我的答案--我们可以在创建视图之前将所有更改写入磁盘吗?----这是至关重要的,因为我希望确保扫描所有项目(在以前的操作中更改或创建)上的索引。您可以使用PersistTo标志来观察更改,直到更改被持久化到磁盘,但这会带来性能损失。Couchbase视图最终是一致的,如果您的系统是高吞吐量的,那么观察和使用Stale false将对其产生很大影响,而且由于数据量的原因,视图仍然是不一致的。如果用户余额不能小于0,那么我会在代码逻辑中设置一个业务角色,这样您就不会出现这种情况。我遇到了一个更大的问题:我调用cbClient.createDesignDoc()来创建我的视图,然后立即查询该视图(当然是stale=false)——我收到一个异常,说“view_undefined”-可能该视图尚未创建…您知道如何在继续查询它之前确保它已创建?即使在更改对client.asyncCreateDesignDoc的调用,验证Future.get()返回true后,仍会引发异常-我是否遗漏了什么?