Присоединиться / сумма с CouchDB - PullRequest
4 голосов
/ 23 декабря 2009

Используя 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);
}

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

Ответы [ 2 ]

7 голосов
/ 31 декабря 2009

Карта:

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;
}

Другим вариантом было бы использовать сопоставление вида , чтобы добиться цели.

1 голос
/ 23 декабря 2009

Прежде всего, пожалуйста, не создавайте свой собственный _id, позвольте CouchDB создать uuid для вас. Это намного лучше, я обещаю вам:)

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

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

...