如何在Couchdb map / reduce中查看用户对喜爱的用户文档的看法?

时间:2010-03-22 23:54:43

标签: couchdb mapreduce

我的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"] }

2 个答案:

答案 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]);
        }
    }
}