1

我正在使用 Couchbase Java API 2.1.2 在代码中创建一个视图,如下所示:

DefaultView view = DefaultView.create(viewName, jsMapFunctionAsString);
List<View> views = new ArrayList<>();
views.add(view);
DesignDocument doc = DesignDocument.create(name, views);
bucket.bucketManager().insertDesignDocument(doc);

ViewResult result = bucket.query(ViewQuery.from(name, viewName))插入文档后直接调用,viewResult.success()总是返回true,但迭代器rows()iterator返回0行(肯定有结果存在。当我在Web界面中执行视图时,它返回正确的值)。

几个小时后我发现的解决方法是调用query两次,中间有足够的等待时间

ViewResult result = bucket.query(ViewQuery.from(name, viewName));
Thread.sleep(10000);
result = bucket.query(ViewQuery.from(name, viewName));

然后第二次调用将返回正确的结果。

似乎 Couchbase 必须先为查询构建索引但直接返回,甚至在索引构建之前。
等待 10 秒当然不是最优的,将来创建索引可能会花费更多时间。

所以我的问题是,我怎样才能确保我只等到索引建立完成?
这是 API 中的错误吗?

4

1 回答 1

4

您可以使用该stale方法并在 中将其设置为 false ViewQuery,这将强制在返回结果之前等待索引完成。

于 2015-04-25T10:28:54.833 回答