我的Couchdb数据库作为主文档类型,如下所示:
{
"_id" : "doc1",
"type" : "main_doc",
"title" : "the first doc"
...
}
还有另一种存储用户信息的文档。我希望用户能够将文档标记为收藏夹。不同的用户可以保存与收藏夹相同或不同的文档。我的想法是引入一个喜欢的文档来跟踪这样的事情:
{
"_id" : "fav1",
"type" : "favorite",
"user_id" : "user1",
"doc_id" : "doc1"
}
使用user_id创建一个视图很容易,因为它是获取自己喜欢的文档ID列表的关键。 E.g:
function(doc) {
if (doc.type == "favorite") {
emit(doc.user_id, doc.doc_id);
}
}
但是我想列出收藏夹以显示文档中的user_id,doc_id和title。所以输出如下:
{ "key" : "user1", "value" : ["doc1", "the first doc"] }
答案 0 :(得分:2)
在CouchDB 0.11(刚刚发布)中,include_docs=true
功能allows you to look up any document in your view row。例如:
function(doc) {
if(doc.type == "favorite") {
emit(doc.user_id, {_id: doc.doc_id});
}
}
当您使用include_docs=true
查询视图时,您应该看到如下的JSON:
// ... normal stuff
rows: [
{
"key":"user1",
"value":{"_id":"doc1"},
"doc": {
"_id" : "doc1",
"type" : "main_doc",
"title" : "the first doc"
// ...
}
},
{
// another doc, etc...
}
]
答案 1 :(得分:0)
如果您无法在v0.11中使用include_docs=true
功能,那么在为视图/地图发布数据时,您必须掌握所有信息。
考虑在main_doc
文档中存储“收藏”用户列表,而不是传统的“加入”方式。
{
"_id" : "doc1",
"type" : "main_doc",
"title" : "the first doc",
"favorited_by": ["user1", "user2"]
// ...
}
这样,当您的视图运行时,您可以根据该文档中的信息发出所有内容。
function(doc) {
if(doc.type == "main_doc") {
for (var a in doc.favorited_by) {
emit(doc.favorited_by[a], [doc._id, doc.title]);
}
}
}