我有一个带有映射器的简单视图,它发出带有一些键的文档。
com.couchbase.lite.View view = database.getView(VIEW_NAME);
if (view.getMap() == null) {
Mapper map = new Mapper() {
@Override
public void map(Map<String, Object> document, Emitter emitter) {
if ("user".equals(document.get("type"))) {
emitter.emit(document.get("name"), document);
}
}
};
view.setMap(map, null);
}
有了这个视图,我可以在其上创建查询,使用某些参数,如 setKeys、startKey、endKey、setDescending、setDescending、setSkip 和其他如 couchbase手册中所述。
如果我写
Query query = view.createQuery();
List<Object> keys = new ArrayList<>();
keys.add("User Name");
query.setKeys(keys);
该查询将返回与“用户名”键匹配的所有文档。
但是我找不到一种简单的方法来编写排除(省略)具有某些键的文档的查询(例如与 setKeys() 函数相反)
在ToDoLite 示例中发现了一个 hack 代码如下所示:
public static Query getQuery(Database database, final String ignoreUserId) {
com.couchbase.lite.View view = database.getView(VIEW_NAME);
if (view.getMap() == null) {
Mapper map = new Mapper() {
@Override
public void map(Map<String, Object> document, Emitter emitter) {
if ("user".equals(document.get("type"))) {
if (ignoreUserId == null ||
(ignoreUserId != null &&
!ignoreUserId.equals(document.get("user_id")))) {
emitter.emit(document.get("name"), document);
}
}
}
};
view.setMap(map, null);
}
Query query = view.createQuery();
return query;
}
请注意,该视图将仅排除您在第一次调用期间传递给它的键ignoreUserId,并在下次调用期间忽略所有其他键(因为它只会在第一次调用期间创建一次视图)
因此,您需要为他们想要省略的每个键创建新视图。但是,如果您有很多要排除的键或经常这样做,那将是低效的和样板的。
你知道任何更好的解决方案或黑客吗?
任何帮助表示
感谢提前感谢