Couchbase - 创建视图并立即访问其数据
Posted
技术标签:
【中文标题】Couchbase - 创建视图并立即访问其数据【英文标题】:Couchbase - Creating a View and accessing its data immediatelly 【发布时间】:2014-06-17 09:29:12 【问题描述】:假设我需要一个(自动)升级脚本,如果它是 ,它会重置所有用户的余额
我想运行一个java代码:
-
使用适当的地图功能创建视图(即仅余额
扫描视图并更新用户
我知道如何使用“CouchbaseClient.createDesignDoc”创建视图以及如何使用 View/Query Java API 查询它
我缺少的是两个问题:
如何将该视图发布到生产环境?目前该视图是在开发模式下创建的,因此仅扫描“用户”文档的子组
如何确保在创建视图后,所有数据(包括当前位于 Couchbase 的写入队列中的数据)都会为它编制索引?
谢谢
艾尔
【问题讨论】:
【参考方案1】:我很乐意回答我自己的问题,希望对其他人有所帮助
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 及更新版本 为了确保您查询视图并等待所有结果,视图的陈旧属性为 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);
Details on couchbase blog
希望对你有帮助
艾尔
【讨论】:
Stale==False 只会索引磁盘上的数据,任何尚未持久化的写入/突变都不会在视图中被拾取。 非常重要的评论,@scalabilitysolved,谢谢——我会更新我的答案——我们可以让 CB 在创建视图之前将所有更改写入磁盘吗? ------ 这很重要,因为我想确保对 ALL 项(在以前的操作中更改或创建)完成索引扫描 好吧,您可以使用 PersistTo 标志来观察更改,直到将其持久化到磁盘,但这会降低性能。 Couchbase 视图最终是一致的,如果您的系统具有高吞吐量,那么观察和使用 Stale false 会对其产生很大影响,而且由于数据量的原因,视图仍然会不一致。如果用户余额不能小于 0,那么我将在代码逻辑中扮演业务角色,这样您就不会陷入这种情况。 我遇到了一个更大的问题:我调用 cbClient.createDesignDoc() 来创建我的视图,然后立即查询该视图(当然是 stale=false) - 我得到一个异常说“view_undefined” - 可能视图还没有创建...你知道在我继续查询之前如何确定它吗? 即使更改了对 client.asyncCreateDesignDoc 的调用,验证 Future.get() 返回 true,异常仍然抛出 - 我错过了什么吗?以上是关于Couchbase - 创建视图并立即访问其数据的主要内容,如果未能解决你的问题,请参考以下文章
使用 Simba ODBC 驱动程序从 Excel 查询 Couchbase 视图