Couchbase Lite SQL++查询报错:OBJECT_VALUES语法问题及替代方案
方案1:修正SQL++ for Mobile的查询语句
Couchbase Mobile的SQL++解析器对部分函数的语法处理与Server端N1QL略有差异,可改用OBJECT_PAIRS遍历键值对实现相同逻辑:
SELECT * FROM bucket.cloud.books AS d WHERE d.doc_type = 'book_item' AND ANY pair IN OBJECT_PAIRS(d.plumap) SATISFIES pair.value.title LIKE '%mock%' END LIMIT 5
若使用较新版本的Couchbase Mobile,也可尝试给OBJECT_VALUES的参数添加空格(旧版本解析器对空格敏感):
SELECT * FROM bucket.cloud.books AS d WHERE d.doc_type = 'book_item' AND ANY v IN OBJECT_VALUES( d.plumap ) SATISFIES v.title LIKE '%mock%' END LIMIT 5
方案2:使用QueryBuilder构建查询(推荐)
为彻底避免SQL语法兼容问题,建议使用Couchbase Lite的QueryBuilder API,Android端实现代码如下:
import com.couchbase.lite.*; // 初始化数据库与集合 Database db = getDatabaseInstance(); // 替换为你的数据库初始化逻辑 Collection booksCollection = db.getCollection("cloud", "books"); // 构建查询 Query query = QueryBuilder.select(SelectResult.all()) .from(DataSource.collection(booksCollection)) .where( Expression.property("doc_type").equalTo(Expression.string("book_item")) .and( Expression.any("pair") .in(Function.objectPairs(Expression.property("plumap"))) .satisfies(Expression.property("pair.value.title").like(Expression.string("%mock%"))) ) ) .limit(Expression.intValue(5)); // 执行并处理结果 try (ResultSet rs = query.execute()) { for (Result res : rs) { // 按需处理结果,比如转为Map或自定义对象 Map<String, Object> doc = res.toMap(); // ... } } catch (CouchbaseLiteException e) { // 处理异常 e.printStackTrace(); }
该方案通过API构建查询,完全规避手写SQL的语法差异,适配性更强。
内容的提问来源于stack exchange,提问作者Ranjan
相关产品推荐
相关产品推荐

