Как я могу просмотреть избранные пользовательские документы по пользователю на карте Couchdb / уменьшить? - PullRequest
1 голос
/ 23 марта 2010

Моя база данных Couchdb в качестве основного типа документа, который выглядит примерно так:

{
   "_id" : "doc1",
   "type" : "main_doc",
   "title" : "the first doc"
   ...
}

Существует другой тип документа, в котором хранится информация о пользователе. Я хочу, чтобы пользователи могли отмечать документы как избранные. Разные пользователи могут сохранять одни и те же или разные документы в качестве избранных. Моя идея состояла в том, чтобы представить любимый документ, чтобы отследить это что-то вроде:

{
   "_id" : "fav1",
   "type" : "favorite",
   "user_id" : "user1",
   "doc_id" : "doc1"
}

Достаточно легко создать представление с ключом user_id, чтобы получить список их любимых идентификаторов документов. Например:

function(doc) {
   if (doc.type == "favorite") {
      emit(doc.user_id, doc.doc_id);
   }
 }

Однако я хочу добавить в список избранного, чтобы отобразить user_id, doc_id и заголовок из документа. Поэтому выведите что-то вроде:

{ "key" : "user1", "value" : ["doc1", "the first doc"] }

Ответы [ 2 ]

2 голосов
/ 23 марта 2010

В CouchDB 0.11 (только что выпущена недавно) функция include_docs=true позволяет вам искать любой документ в строке просмотра . Например:

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...
  }
]
0 голосов
/ 24 марта 2010

Если вы не можете использовать функцию include_docs=true с v0.11, то при отправке данных для просмотра / карты у вас должна быть вся информация под рукой.

Вместо традиционного стиля "присоединения" рассмотрите возможность сохранения списка "избранных" пользователей в документах 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]);
        }
    }
}
...