【发布时间】:2011-11-15 07:15:14
【问题描述】:
有没有一种好方法可以模拟 CouchDB 中 SELECT COUNT(DISTINCT field) 的行为?
假设我们有以下文档,它记录了用户播放某首歌曲的时间:
{
song_id: "happy birthday",
user_id: "boris",
date_played: [2011, 11, 14, 00, 12, 55],
_id: ...
}
我想知道我们的用户“boris”播放过的不同歌曲的数量。如果我们的用户已经听了 20 次“生日快乐”,那首歌曲应该仍然只为总歌曲数贡献 +1。
在 MySQL 中,我会简单地执行 SELECT COUNT(DISTINCT song_id) FROM plays WHERE user_id = "boris",但在 CouchDB 中编写它时,我是在画一个空白。
解决方法 1: 如果我更改架构并将所有歌曲播放存储在单个用户文档中以供“boris”使用,那么我可以编写一个地图以仅发出不同的值。但是,如果我想在 last.fm 的规模上构建一些东西,我担心随着“boris”文档大小(播放次数)的持续增长,更新将开始花费很长时间。 (我最终可能会达到最大文档大小)。
解决方法 2: 我还可以编写一个映射函数来返回 所有 不同的记录,我的 Python 脚本可以自行总结这些记录;但同样有数十万首不同的歌曲,这也会变得非常缓慢。
我还缺少哪些其他选项?
【问题讨论】:
-
我也考虑过简单地将这些信息写成一个单独的文档:检查 (user_id, song_id) 是否已经存在,如果存在则更新时间戳,否则插入新文档。但我希望我可以使用 CouchDB 的增量 map/reduce 更新来为我构建这个缓存。
标签: couchdb