Сортировка результатов по популярности - PullRequest
1 голос
/ 18 сентября 2011

Я сейчас использую couchdb для информации о пользователях.Пользователи могут иметь друзей на моем сайте.Я хотел бы отобразить всех людей, добавивших «Я» в друзья, по количеству людей, у которых в качестве друга указано «some_user»

Упрощенный документ будет выглядеть так:

{
   "_id": "some_id",
   "Name": "Some user",
   "lastMod": "1316300162",
   "aFriends": [
       {
           "Name": Me",
           "More": "More info ... "
       },
       {
           "Name": Friend1"
           "More": "More info ... "
       }
   ]
}

В настоящее время я использую этот вид, чтобы показать всех друзей

function(doc) {
 if(doc.aFriends.length > 0) {
    for(var i in doc.aFriends) {
       emit(doc.aFriends[i]['Name'],{UserName: doc.Name, More: doc.aFriends[i]['More']});
    }
  }
}

Однако это просто показывает имена в алфавитном порядке.Я хотел бы заказать их по количеству пользователей, у которых есть пользователь в качестве друга.Есть ли хороший способ проиндексировать это в couchdb?

Этаж

1 Ответ

0 голосов
/ 20 сентября 2011

Вы не можете сделать это напрямую в CouchDB, потому что вы можете одновременно работать только с одним документом.

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

У вас есть несколько вариантов, как это сделать, но что лучше всего зависит от того, как структурирован ваш код.

Вы можете переназначить значение для всех друзей пользователя как часть функции сохранения для объекта User. Преимуществом этого является простота и мгновенное обновление значения, но это замедлит сохранение, а если вы сохраните пользователей в нескольких местах, это будет сложно.

Вы можете использовать систему обработки фоновых задач (например, Celery ) для обновления значения. Это похоже на обновление его как части функции сохранения, но вы мгновенно получаете выгоду от более быстрого процесса сохранения.

Наконец, вы можете отслеживать _changes , чтобы следить за изменениями в списках друзей и денормализовать значение в них. Это дает преимущество, заключающееся в том, что обновление хранится в одном месте и полностью отделено от остального кода, а также гарантирует, что вы не пропустите и не обновите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...