Запрос о проблемах Couchbase Lite с использованием MapReduce Views - PullRequest
0 голосов
/ 29 апреля 2018

Я столкнулся с проблемой, связанной с запросом базы данных Couchbase lite 1.4 на моем мобильном устройстве Android. Мне кажется, что я не совсем понимаю, как работает запрос с помощью MapReduce Views.

Итак, у меня есть следующие настройки:

1) База данных, которая содержит объекты вроде:

{
  dateCreated: 1220227200,
  relatedObjectId: "objectId_23445"
  type: "mytype"
}

2) Я хотел бы запросить мою базу данных и получить все объекты типа " mytype ", которые связаны с объектом с данным идентификатором ( relatedObjectId поле) и отсортированы по dateCreated поле.

Вот моя функция карты, которая генерирует вид:

public void map(Map<String, Object> document, Emitter emitter) {
  if (document.get("type") != null && document.get("type").equals("mytype")) {
                            List<Object> keys = new ArrayList<Object>();
                            keys.add(document.get("dateCreated");
                            keys.add(document.get("relatedObjectId"));
                            emitter.emit(keys, null);
   }
}

3) Эта функция выводит результаты примерно так:

[1220227200, objectId_23445],
[1220227201, objectId_3],
[1220227202, objectId_7],
[1220227203, objectId_8],
[1220227204, objectId_23445]

4) Я хочу получить все объекты с идентификатором " objectId_23445 ", отсортированные по дате, например:

[1220227200, objectId_23445],   
[1220227204, objectId_23445]

5) Но в результате я всегда получаю все объекты из базы данных.

First dateCreated , похоже, принимается во внимание, но моя вторая часть ключа ( relatedObjectId ) на самом деле не участвует в фильтрации. Поэтому я всегда получаю список из пункта 3.

Мой запрос выглядит так:

String relatedObjectId = "objectId_23445"
    Query query = CouchbaseViews.GetAllMyTypeItems().createQuery();            
            query.setDescending(true);

            ArrayList<Object> startKey = new ArrayList<Object>();
            startKey.add(0);
            startKey.add(relatedObjectId );

            ArrayList<Object> endKey = new ArrayList<Object>();
            endKey.add(Calendar.getInstance().getTimeInMillis());
            endKey.add(relatedObjectId );

            query.setStartKey(endKey);
            query.setEndKey(startKey);

Так что мне нужна помощь с этим. По моему мнению, я просто не понимаю, как фильтровать объекты, когда ключ является составным ключом (в моем случае arrayList).

В качестве обходного пути я могу только выдать relatedObjectId и затем отсортировать данные вручную, но это ли правильный способ сделать это?

Любая помощь будет оценена, спасибо заранее!

1 Ответ

0 голосов
/ 29 апреля 2018

Я решил свою проблему после некоторых дополнительных исследований (включая некоторые сообщения о stackoverflow).

Похоже, что для того, чтобы достичь того, чего я хотел прежде всего, мне нужно изменить порядок в map () function:

public void map(Map<String, Object> document, Emitter emitter) {
  if (document.get("type") != null && document.get("type").equals("mytype")) {
                            List<Object> keys = new ArrayList<Object>();    
                            //order of elements have been changed                        
                            keys.add(document.get("relatedObjectId"));
                            keys.add(document.get("dateCreated");
                            emitter.emit(keys, null);
   }
}

После этой модификации наша функция map () выдает следующий вывод:

[objectId_23445, 1220227200],
[objectId_3, 1220227201],
[objectId_7, 1220227202],
[objectId_8, 1220227203],
[objectId_23445, 1220227204]

И, наконец, я должен изменить свой запрос следующим образом:

String relatedObjectId = "objectId_23445"
    Query query = CouchbaseViews.GetAllMyTypeItems().createQuery();            
            query.setDescending(true);

            ArrayList<Object> startKey = new ArrayList<Object>();            
        startKey.add(relatedObjectId );

            ArrayList<Object> endKey = new ArrayList<Object>();
            endKey.add(relatedObjectId );
        endKey.add(new HashMap<>());

            query.setStartKey(endKey);
            query.setEndKey(startKey);

Теперь мой запрос будет сначала выбирать все элементы с relatedObjectId , а затем сортировать эту последовательность, и, поскольку у нас всегда будет одинаковый префикс для всех элементов ( relatedObjectId ), второй элемент будет учитываться при сортировке ( dateCreated ).

...