2011-08-05 10 views
3

MongoDBでデータを表現する際に問題があります。私は日付と単語の組み合わせが一意であるこのスキーマ設計を使用していました。MongoDB Update/Upsert質問 - スキーマ関連

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

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

固定日数は約200です。潜在的に100k +各日付の単語; 100k人以上のユーザー。

私はそうのようなアルゴリズムを使用してレコードを挿入:

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') 

しかし、このスキーマは非常に大規模なコレクションをもたらし、ひどいパフォーマンスはひどいものでした。私は4つのコレクションのそれぞれに異なる情報を挿入しているので、データベース上の操作は非常に多くなります。

このような形式でデータを表現することを検討しています。単語とユーザーの配列はセットです。

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

これの背後にあるアイデアは、データベース操作の数を減らすことでした。アルゴリズムの各ループでは、コレクションごとに1つの更新だけを実行します。しかし、私はアルゴリズムの各ループで新しい単語、ユーザー、またはその両方を挿入する必要があるかもしれないので、これに対して更新/アップサンプリングを実行する方法がわかりません。

この文書を更新する方法をお勧めする人もあれば誰かが別のスキーマを提案する人もいますか?

ありがとうございます。

+0

に挿入したいコレクションを指定します。どのような方法であなたのパフォーマンスはひどいものでした?パフォーマンスやクエリを書く? – rompetroll

+0

@deadsven、書き込みと更新のパフォーマンス。クエリは高速ですが、書き込みと更新はパフォーマンスが悪いです。 –

答えて

0

Upsertは、ドキュメントを動的に拡張するのに適しています。残念ながら、更新オブジェクトに原子修飾子操作がある場合は、正しく動作していることがわかりました。 $ addToSet(mongoシェルコード)のように:

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" ] } } 

ここでもう1人のユーザーを1つの更新の最初の単語と別の単語に追加します。

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" ] } } 
0

MongoDBを使用して〜10個の属性を持つ105milレコードを挿入しています。変更でこのデータセットを更新するのではなく、すべてを削除して再度挿入します。この方法は、各行を個別にタッチして更新する必要があるかどうかを確認するよりも高速であることがわかりました。 JSON形式のテキストファイルを作成し、MongoDBのmongoimportツールを使用すると、挿入速度が向上します。 JSON TXTファイル(コレクションごとに1つのファイル)

  • mongoimport各ファイルに

    1. フォーマットデータと、それは好奇心から