如何在CouchDB中为M-N关系编写查询?

时间:2014-07-14 13:58:20

标签: javascript couchdb

我在CouchDB中有两种类型的文档:用户和音乐。每个用户都可以将音乐类型添加到他的个人资料中。文件的结构是:

User { uid: ... , type: 'user', name: ...., surname: ....};

Music {mid: ..., type: 'music', genre: 'rock'};

User_Music { uid: ... , mid: ....};

我想查询加入这些文档......我怎么能在CouchDB中做到这一点?

1 个答案:

答案 0 :(得分:0)

您无法像在关系数据库中那样在服务器的单个查询中加入文档。但是,您可以创建一个视图,按顺序对用户及其音乐进行排序,以便您获得几乎相同的结果。但是,所有文档都必须具有公共密钥字段。在您的示例中,您只能伪连接任何两种文档类型。以下是:

修改您的加入文档以包含类型:

User_Music {umid: ..., type: 'usermusic', uid: ... , mid: ....};

然后是观点:

{
    "map":function(doc) {
        if (doc.type == 'user') {
            emit([doc._id, 0], doc);
        } else if (doc.type == 'usermusic') {
            emit([doc.uid, 1, mid], doc);
        }
    }
}

将返回按user_id排序的音乐ID列表。您可以通过传递开始键和结束键来查询个人的视图,例如,startkey" [" user1"]"和endkey" [" user1",{}]"获取user1的音乐列表 - 然后迭代结果并查询返回的每个music_id的音乐文档。