3

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

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

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

約 200 の固定数の日付があります。日付ごとに潜在的に 100,000 語以上。10 万人以上のユーザー。

次のようなアルゴリズムでレコードを挿入しました。

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 回だけ実行します。ただし、アルゴリズムの各ループで、新しい単語、ユーザー、またはその両方を挿入する必要がある場合があるため、これに対して更新/アップサートを実行する方法がわかりません。

誰かがこのドキュメントを更新する方法を推奨できますか、または誰かが代替スキーマを提案できますか?

ありがとう

4

2 に答える 2

0

アップサートは、ドキュメントを動的に拡張するのに適しています。残念ながら、更新オブジェクトにアトミック修飾子操作がある場合にのみ、正しく機能することがわかりました。ここの$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回の更新で、最初の単語と別の単語にさらにユーザーを追加します。

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" ] } }
于 2011-08-05T11:51:11.773 に答える
0

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

  1. データを JSON txt ファイルにフォーマットします (コレクションごとに 1 つのファイル)
  2. mongoimport 各ファイルを挿入し、挿入するコレクションを指定します
于 2011-08-09T14:30:19.240 に答える