Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Couchbase-创建视图并立即访问其数据_Java_View_Couchbase - Fatal编程技术网

Java Couchbase-创建视图并立即访问其数据

Java Couchbase-创建视图并立即访问其数据,java,view,couchbase,Java,View,Couchbase,假设我需要一个(自动)升级脚本,如果

假设我需要一个(自动)升级脚本,如果<0,它将重置所有用户的余额

我想运行一个java代码,它:

  • 创建具有适当映射功能的视图(即,只有余额小于0的“用户”文档)
  • 扫描视图并更新用户
  • 我知道如何使用“CouchbaseClient.createDesignDoc”创建视图,以及如何使用view/QueryJavaAPI进行查询

    我缺少的是两个问题:

  • 如何将该视图发布到生产?当前视图是在开发模式下创建的,因此只扫描“用户”文档的一个子组

  • 如何确保创建视图后,它将在所有数据上建立索引,包括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);
    

    希望能有帮助


    Eyal

    Stale==False将只索引磁盘上的数据,视图中不会拾取任何尚未持久化的写入/突变。非常重要的注释@scalabilitysolved,谢谢--我将更新我的答案--我们可以在创建视图之前将所有更改写入磁盘吗?----这是至关重要的,因为我希望确保扫描所有项目(在以前的操作中更改或创建)上的索引。您可以使用PersistTo标志来观察更改,直到更改被持久化到磁盘,但这会带来性能损失。Couchbase视图最终是一致的,如果您的系统是高吞吐量的,那么观察和使用Stale false将对其产生很大影响,而且由于数据量的原因,视图仍然是不一致的。如果用户余额不能小于0,那么我会在代码逻辑中设置一个业务角色,这样您就不会出现这种情况。我遇到了一个更大的问题:我调用cbClient.createDesignDoc()来创建我的视图,然后立即查询该视图(当然是stale=false)——我收到一个异常,说“view_undefined”-可能该视图尚未创建…您知道如何在继续查询它之前确保它已创建?即使在更改对client.asyncCreateDesignDoc的调用,验证Future.get()返回true后,仍会引发异常-我是否遗漏了什么?