Есть ли хороший способ имитировать поведение SELECT COUNT (поле DISTINCT) в CouchDB?
Представьте, что у нас есть следующий документ, в котором записано время, когда пользователь играл определенную песню:
{
song_id: "happy birthday",
user_id: "boris",
date_played: [2011, 11, 14, 00, 12, 55],
_id: ...
}
Я бы хотел знать количество отдельных песен, когда-либо сыгранных нашим пользователем "boris" . Если наш пользователь прослушал «Happy Birthday» 20 раз, эта песня все равно должна внести всего +1 в общее количество песен.
В MySQL я просто выполнил бы SELECT COUNT(DISTINCT song_id) FROM plays WHERE user_id = "boris"
, но я рисую пробел, когда дело доходит до написания этого в CouchDB.
Work-Around 1: Если бы я изменил свою схему и вместо этого сохранил все пьесы в одном пользовательском документе для «boris», я мог бы тогда написать карту для выдачи только отдельных значений. Однако, если бы я захотел создать что-то в масштабе last.fm, я боюсь, что обновления начнут занимать очень много времени, так как размер документа «boris» (количество воспроизведений) продолжал расти. (Также может быть максимальный размер документа, который я в итоге получу).
Work-Around 2: Я также мог бы написать функцию карты, которая возвращает все отдельных записей, которые мой скрипт на Python мог бы суммировать сам; но опять же с сотнями тысяч разных песен это тоже станет очень медленным.
Какие еще опции мне не хватает?