Создайте представление для получения нескольких документов в CouchDb

CouchDb новичок здесь.

У меня есть несколько документов в CouchDb с одинаковой структурой:

{
    "_id": "1170140286",
    "_rev": "1-79ffad4d4cbe24effc72f9ec519373ca",
    "data": [
        {
            "photo": "link_of_photo1",
            "userid": "34623",
            "username": "guest-user1"
        },
        {
            "photo": "link_of_photo2",
            "userid": "34623",
            "username": "guest-user1"
        },
        {
            "photo": "link_of_photo3",
            "userid": "34623",
            "username": "guest-user1"
        }
    ]
}

а также

{
    "_id": "43573458",
    "_rev": "1-0ca5aa68590fcb58399fe059aa8fb881",
    "data": [
        {
            "photo": "link_of_photo1",
            "userid": "6334",
            "username": "guest-user2"
        },
        {
            "photo": "link_of_photo2",
            "userid": "6334",
            "username": "guest-user2"
        },
        {
            "photo": "link_of_photo3",
            "userid": "6334",
            "username": "guest-user2"
        }
    ]
}

Я не знаю, возможно ли то, что я хочу сделать, но я пытаюсь создать представление, которое объединит элементы данных этих документов в один документ:

[
    {
        "photo": "link_of_photo1",
        "userid": "34623",
        "username": "guest-user1"
    },
    {
        "photo": "link_of_photo2",
        "userid": "34623",
        "username": "guest-user1"
    },
    {
        "photo": "link_of_photo3",
        "userid": "34623",
        "username": "guest-user1"
    },
    {
        "photo": "link_of_photo1",
        "userid": "6334",
        "username": "guest-user2"
    },
    {
        "photo": "link_of_photo2",
        "userid": "6334",
        "username": "guest-user2"
    },
    {
        "photo": "link_of_photo3",
        "userid": "6334",
        "username": "guest-user2"
    }
]

Я почти уверен, что не правильно понял логику couchdb, поэтому любая помощь очень важна.

2 ответа

То, что вы можете получить, это результат просмотра со всеми включенными ссылками. Это будет массив, но он будет немного отличаться от вашей смоделированной структуры результатов. Логика представления может выглядеть следующим образом (ключ строк не используется в примере - возможно, имя пользователя или идентификатор является полезным значением для вставки):

function (doc) {
  var data = doc.data
  if (!data) return

  for (var i = 0, link; link = data[i++];)
    emit(null, link)
}

Для полноты картины следует упомянуть, что существует способ "объединить все документы" на стороне сервера. Результат просмотра может быть обработан списком CouchDB до того, как данные наконец будут отправлены обратно запрашивающей стороне. But.it.is.not.recommended! Пожалуйста, отнеситесь к этому серьезно и не пытайтесь это сделать - это серьезная проблема с производительностью, которая никогда не была целью CouchDB для предоставления таких вариантов использования.

Please refer these links.

http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views

CouchDB "Join" two documents

/questions/9254900/obedinit-neskolko-dokumentov-v-predstavlenii-couchdb

Образец кода:

function(doc){
if(doc.items)
doc.items.forEach(function(item){
      emit(doc._id,{_id:item});
  })

}

Я надеюсь, что это решит вашу проблему.

Другие вопросы по тегам