Получение последних ревизий в Couchbase с N1QL

Предположим, у меня есть куча документов в Couchbase, как показано ниже.

user lastUpdate    otherField1
a    "2015-12-06"  1    
a    "2015-11-06"  2
b    "2015-12-05"  3    
b    "2015-10-05"  4

Как я могу получить в одном запросе N1QL последний обновленный документ для каждого пользователя? Я начал использовать N1QL несколько дней назад и не знаю, как выполнять такие сложные запросы. Спасибо


person faysou    schedule 06.12.2015    source источник


Ответы (1)


Вы можете сделать следующее:

SELECT user, MAX( [ lastUpdate, doc ] ) AS pair
FROM my_bucket AS doc
GROUP BY user;
person geraldss    schedule 06.12.2015
comment
Это очень элегантно, спасибо. Но я не знаю, как бы я нашел это в одиночку. У вас есть указатель на соответствующую документацию? - person faysou; 07.12.2015
comment
Я добавил заявку JIRA, чтобы задокументировать это: issues.couchbase.com/browse/DOC-982 < / а> - person geraldss; 07.12.2015
comment
Спасибо, я надеюсь, что однажды смогу творить волшебство, как ты! А пока полезно знать, что кто-то со знанием n1ql готов помочь. Пользуюсь mongo уже год, а на выходных перешел на диван, мне это очень нравится. - person faysou; 08.12.2015
comment
На самом деле вы не просто обладаете знаниями, вы мужчина! Поздравляю с тем, что вы делаете. - person faysou; 08.12.2015
comment
Спасибо :) Мне нравится именно этот запрос. Если вы немного использовали Couchbase и N1QL, поделитесь с нами своим опытом и вариантами использования на форумах Couchbase. - person geraldss; 08.12.2015
comment
Приведенный выше запрос не работает @geraldss, документы пользователя не самые свежие. Я использую запрос (адаптированный к примеру): SELECT *, MAX ([lastUpdate, doc]) AS pair FROM my_bucket AS doc GROUP BY user; - person faysou; 11.01.2016
comment
Этот запрос работает для получения всего документа SELECT MAX ([lastUpdate, doc]) [1] FROM my_bucket AS doc GROUP BY user - person faysou; 11.01.2016
comment
Для информации: мне очень понравился этот документ по sql ++ arxiv.org/abs/1405.3631, чтобы получить больше интуиции о как работает запрос N1QL. - person faysou; 11.01.2016
comment
как получить последние n записей для каждого пользователя? Это скорее из любопытства, так как ваш ответ уже многому меня научил. - person faysou; 11.01.2016
comment
Мы тесно сотрудничаем с командой SQL ++ в UCSD. Не уверен, зачем вам делать SELECT *. Мы отключим SELECT * при наличии GROUP BY. - person geraldss; 12.01.2016
comment
Кстати, ваш второй запрос верен. Я хотел предоставить шаблон, чтобы показать, почему он выбирает последнюю версию, поэтому я оставил lastUpdate там. Дайте мне подумать о последних N на пользователя ... - person geraldss; 12.01.2016
comment
Потому что я хотел выбрать все поля документа. Да, я читал о n1ql = sql ++. - person faysou; 13.01.2016
comment
Теперь я лучше понимаю, как должен работать n1ql. Это должно быть какое-то сокращение карты, чтобы иметь возможность выполнять максимальную операцию с массивами, созданными на лету. - person faysou; 13.01.2016
comment
N1QL фактически основан на SQL, а не на map-reduce. SQL предшествовал map-reduce и всегда имел агрегацию (GROUP BY). Map-reduce - это форма агрегирования / сокращения. Возможности агрегации SQL / N1QL, с одной стороны, частично совпадают, с другой - map-reduce. - person geraldss; 14.01.2016