Как эффективно объединить данные из одной коллекции в другую, используя MongoDB? - PullRequest
1 голос
/ 28 января 2011

У меня есть проблема, которую я не знаю, как решить эффективно.

У меня есть две коллекции:

1)

hits = {
    'day': '',
    'number_of_hits': 0
    'user_id': 0
} 

2)

stats = {
    'day': '',
    'total_number_of_hits': 0
    'user_id': 0
    ...
    some other stuff
}

Мне нужно получать суммы number_of_hits за каждый день (может быть много документов на каждый день, содержащих различное количество посещений) и обновлять коллекции статистики этими суммами как можно быстрее.Это должно быть сделано для каждого user_id, найденного в коллекции хитов

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

Но что-то подсказывает мне, что это не очень хороший способ.

Также иногда в коллекции статистики может не быть документов в течение нескольких дней, поэтому их нужно создавать, а не обновлять.

Если вы можете дать мне какие-либо идеи, это было бы удивительно:)

Спасибо, PabloX

Ответы [ 3 ]

3 голосов
/ 28 января 2011

Может быть попытаться изменить вашу структуру как

stats{
   'day': '',
   'user_id': 0,
   'hits':{ 
       // Array of your hits document
    }
}

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

0 голосов
/ 28 января 2011

Другой идеей было бы обновление с использованием оператора $ inc. В основном, если существует документ, который соответствует user_id и дате, просто увеличьте число совпадений на единицу, в противном случае вставьте единицу.

Это наиболее эффективный способ, если только выдействительно нужно записывать каждый удар.

Я не уверен, как это делается с python, но посмотрите документацию по Mongo:

http://www.mongodb.org/display/DOCS/Updating#Updating-%24inc

0 голосов
/ 28 января 2011

Ваша проблема кажется классическим случаем для карт Монго / уменьшить возможности.См. http://www.mongodb.org/display/DOCS/MapReduce для получения более подробной информации.

Одна вещь, которую следует остерегаться, однако, с картой / уменьшить.В версии Mongo, которую я использую (1.4.5), выполнение map / redune получает блокировку базы данных, которая блокирует всех читателей и писателей.Не уверен, что это все еще проблема или нет в более новых версиях Mongo.

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