Присоединиться/суммировать с CouchDB

Используя CouchDB, у меня в настоящее время есть документ, который представляет идею, вы можете оценить эту идею. Каждая идея — это один документ, а каждый рейтинг — это отдельный документ. Я делаю это таким образом, чтобы избежать проблем с одновременным доступом, когда люди оценивают идею.

Мои документы выглядят так (я их упростил):

Идея:

{
 "_id": "idea1",
 "title": "A great idea"
}

Рейтинги:

{
 "_id": "rating1",
 "rating": 1,
 "author": "author1"
}

{
 "_id": "rating2",
 "rating": 1,
 "author": "author2"
}

В настоящее время я использую функцию сокращения, чтобы вернуть мне идентификатор идеи и его/ее рейтинг (простую сумму рейтингов):

Карта:

function(doc) {
  if (doc.type == "rating")
    emit(doc.idea_id, doc.rating);    
}

Уменьшать:

function(keys, values, rereduce) {
  return sum(values);
}

Мой вопрос: как я могу «присоединиться» к документу «идея» с результатом сокращения, который представляет рейтинг идеи?


person e-Jah    schedule 23.12.2009    source источник


Ответы (2)


Карта:

function(doc) {
    switch (doc.type) {
        case "idea":   emit(doc._id,     ["idea",  doc]);         break;
        case "rating": emit(doc.idea_id, ["rating", doc.rating]); break;
    }
}

Уменьшать:

function(keys, values, rereduce) {
    var i, l, ret = {idea:null, rating:0};

    for (i = 0, l = values.length; i < l; ++i) {
        switch (values[i][0]) {
            case "idea":   ret.idea = values[i][1];    break;
            case "rating": ret.rating += values[i][1]; break;
        }
    }

    return ret;
}

Другим вариантом может быть использование сопоставления представлений сделать трюк.

person Jakub Kulhan    schedule 31.12.2009

Во-первых, не создавайте свой собственный _id, пусть CouchDB создаст для вас uuid. Так намного лучше, я вам обещаю :)

Короткий ответ: вы не можете получить документ с идеей ни с чем, кроме дополнительного запроса. Хотя запрос довольно быстрый, так как у вас есть _id в документе для голосования.

Если вы хотите вернуть полные документы для всех голосов, чтобы получить комментарии или что-то в этом роде, вы определенно можете это сделать. Просто запустите запрос просмотра с ?include_docs=true

person mikeal    schedule 23.12.2009