2013-11-08 3 views
5

Я пытался выяснить, как вернуть данные на основе метки времени. В основном, я хочу запросить 100 документов на основе поля timestamp. 100 документов должны быть старше, чем метка времени, которую я передал. Также я хочу создать обновление, где я могу передать временную метку, и я получаю 100 новых документов. Очевидно, логика здесь будет иной, но с трудом выяснять, как Couchbase может это сделать.Запрос Couchbase, основанный на времени

Вот то, что я до сих пор:

моего взгляда, как вы можете видеть, что также нужно использовать сложный ключ, потому что я не только проверять дату, но моя видимость поле. У меня нет ничего в сокращенной части представления.

function (doc, meta) 
{ 
    if(meta.type == "json" && doc.type == "POST" && doc.created != null) 
    { 
    emit([dateToArray(doc.created), doc.visibility], null); 
    } 
} 

Я спрашиваю, используя клиент java, для тестирования установлено ограничение на 2. Здесь странно, что setDescending должен быть ложным, чтобы вернуть что-либо обратно. Также не имеет значения, в какую дату я проходил, я всегда получаю результат. Я хочу, чтобы ожидаемое поведение состояло в том, чтобы передать дату и получить результаты, равные или старше даты.

View view = client.getView("dev_posts", "post_list"); 
    ComplexKey keys = ComplexKey.of(DataConstants.getDateAsArray(startDate), postType); 

    Query query = new Query(); 
    query.setRangeStart(keys); 
    query.setIncludeDocs(true); 
    query.setLimit(2); 
    query.setDescending(false); 

    ViewResponse response = client.query(view, query); 

EDIT:

По сути то, что я ищу из Couchbase похож на Facebook, Pintrest и т.д. мобильных приложений. В заданную метку времени, когда пользователь обновляется, я хочу получить что-то новое. Когда пользователь выполняет прокрутку, я хочу получить следующую группу за определенную дату.

** Обновление **

Так что это была решена, но будет расследовать его дальше. ComplexKey превращает наш массив дат в «[2013,11,8,20,0,0]» вместо того, чтобы оставлять его [2013,11,8,20,0,0]. Продолжаем исследовать его дальше. На данный момент работать не нужно, чтобы использовать ComplexKey, но создать наш собственный сложный ключ и передать его startKey как только ключ.

ответ

0

Вы можете использовать систему reference documents с двумя уровнями иерархии. В документах первого уровня эти идентификаторы являются меткой времени (Ref: :). Они должны содержать идентификационные документы, которые вы, наконец, документы. На документе второго уровня, который содержит идентификаторы всех ссылок. документы с первого уровня. Если количество ссылочных документов будет слишком большим, вы можете использовать третий уровень ссылок. Если что-то не совсем ясно, скажите мне, я попытаюсь объяснить это по-другому.

P.S. Также вы можете использовать ElasticSearch. Это даст вам возможность выполнить любой запрос, не создавая иерархию ссылочных документов, но, возможно, проблему с памятью и задержкой репликации.

+0

Спасибо за предложение. Я думаю, что в этом случае ссылочные документы не будут правильной моделью. Действительно, оба условия должны быть выполнены, поэтому время должно быть ниже или выше заданной отметки времени, и поле видимости будет одинаковым для всех документов. Справочные документы по этим данным создавали бы слишком много дополнительных документов в системе. Я создал представления, используя сложные ключи, которые работали достаточно хорошо, но проблема, кажется, является диапазоном со временем. Возможно, мне нужно взглянуть на уменьшенную часть представления. – Michael

+1

Я нашел [что-то] (http://www.couchbase.com/communities/q-and-a/how-write-query-specific-range-and-group-clause), который раньше не знал, может быть, это будет быть полезным для вас. «запрос диапазона читает полный индекс, и мы читаем startkey только слева направо (как полный ключ)». Возможно, после конкатенирования 2 ключей вы всегда получаете результат. Вы проверяете свой запрос без «doc.visibility» в составе ComplexKey? –

1

Вам необходимо реорганизовать и испускают ключ соединение следующим образом:

function (doc, meta) { 
    if(meta.type == "json" { 
    if(doc.type == "POST") { 
     emit([doc.visibility,dateToArray(doc.created)], null);  
    } 
    } 
} 

Который будет производить ключи, как: [правда, [2013,11,8,20,0,0]]

Переходите в startKey и endKey в формате, таком как выше, и это будет фильтровать все документы с даты startKey, которые либо doc.visibility False, либо True (в зависимости от вашего стартового ключа), я предполагаю, что вы хотите только doc.visibility == true.

Ваши ключи возврата будут заказаны первой частью составного ключа, поэтому первый результат в ViewResult будет фактически самым старым возвращенным документом. Поэтому вам нужно будет поменять массив в своей логике приложения, если вы хотите сначала получить самый последний документ.

Не забывайте учитывать устаревший параметр, если вы создаете «живой» канал.

+0

Существует более двух условий для видимости, это не просто истина или ложь – Michael

+0

ОК, поэтому просто создайте свой ключ, как [видимость, [2013,11,8,20,0,0]], что сработает для вас. Не так ли? – scalabilitysolved

+0

Фактически он решил, сложный ключ превращался [2013,11,8,20,0,0] в "[2013,11,8,20,0,0]". Мы хотим, чтобы сортировка была первой. – Michael

Смежные вопросы