MongoDB Update / Upsert Вопрос - Схема, связанная - PullRequest
3 голосов
/ 05 августа 2011

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

{'date':2-1-2011,
'word':word1'
users = [user1, user2, user3, user4]}

{'date':1-1-2011,
'word':word2'
users = [user1, user2]}

Существует фиксированное количество дат, приблизительно 200; потенциально 100 тыс. + слов для каждой даты; и 100к + пользователей.

Я вставил записи с помощью алгоритма, подобного так:

while records exist:
    message, user, date = pop a record off a list
    words = set(tokenise(message))

    for word in words:
        collection1.insert({'date':date, 'word':word}, {'user':user})
        collection2.insert('something similar')
        collection3.insert('something similar again')
        collection4.insert('something similar again')

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

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

{'date':'26-6-2011',
 'words': [
'word1': ['user1', 'user2'],
'word2': ['user1']
'word1': ['user1', 'user2', 'user3']]}

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

Может ли кто-нибудь порекомендовать способ обновления этого документа или кто-то может предложить альтернативную схему?

Спасибо

Ответы [ 2 ]

0 голосов
/ 09 августа 2011

Я использую MongoDB для вставки 105-миллионных записей с ~ 10 атрибутами в каждой.Вместо того, чтобы обновлять этот набор данных изменениями, я просто удаляю и заново вставляю все.Я обнаружил, что этот метод быстрее, чем индивидуальное касание каждой строки, чтобы увидеть, нужно ли ее обновить.Вы будете иметь лучшую скорость вставки, если будете создавать текстовые файлы в формате JSON и использовать инструмент MongoDB для MongoDB.

  1. отформатируйте ваши данные в текстовые файлы JSON (один файл на коллекцию)
  2. mongoimport каждого файла и укажите коллекцию, в которую вы хотите вставить ее
0 голосов
/ 05 августа 2011

Upsert хорошо подходит для динамически расширяемых документов. К сожалению, я обнаружил, что он работает правильно, только если у вас есть атомарный модификатор в вашем объекте обновления. как здесь $ addToSet (код оболочки Монго):

db.words пуст. добавить первый документ на указанную дату с упертой записью.

var query = { 'date' : 'date1' }                        
var update = { $addToSet: { 'words.word1' :  'user1' } }
db.words.update(query,update,true,false)                

проверить объект.

db.words.find();                                        
{ "_id" : ObjectId("4e3bd4eccf7604a2180c4905"), "date" : "date1", "words" : { "word1" : [ "user1" ] } }

теперь добавьте еще пользователей к первому слову и другому слову в одном обновлении.

var update = { $addToSet: { 'words.word1' : { $each : ['user2', 'user4', 'user5'] }, 'words.word2': 'user3' } }
db.words.update(query,update,true,false) 

еще раз, проверьте объект.

db.words.find()                                                                                                
{ "_id" : ObjectId("4e3bd7e9cf7604a2180c4907"), "date" : "date1", "words" : { "word1" : [ "user1", "user2", "user4", "user5" ], "word2" : [ "user3" ] } }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...