いくつかのキーでドキュメントを発行するマッパーを使用した単純なビューがあります。
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 などの特定のパラメーターを使用してクエリを作成できます。
私が書いたら
Query query = view.createQuery();
List<Object> keys = new ArrayList<>();
keys.add("User Name");
query.setKeys(keys);
そのクエリは、「ユーザー名」キーに一致するすべてのドキュメントを返します。
しかし、特定のキーを持つドキュメントを除外 (省略) するクエリを作成する簡単な方法を見つけることができませんでした (setKeys() 関数の反対のように)。
ToDoLite の例で 1 つのハックが見つかりました 。コードは次のようになります。
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のみを除外し、次の呼び出しでは他のすべてを無視することに注意してください (ビューは最初の呼び出しで 1 回だけ作成されるため)。
したがって、省略したいキーごとに新しいビューを作成する必要があります。しかし、除外したいキーがたくさんある場合、または頻繁に除外する場合は、非効率的でボイラープレートになります。
より良い解決策やハックを知っていますか?
よろしくお願いします