在代码中创建Couchbase视图:第一个查询返回0行,索引构建在后台

时间:2015-04-25 09:01:49

标签: java couchbase couchbase-view couchbase-java-api

我正在使用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中的错误吗?

1 个答案:

答案 0 :(得分:3)

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