3

我在 MongoDB 中表示数据时遇到问题。我正在使用这种模式设计,其中日期和单词的组合是唯一的。

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

然而,这种模式导致了非常大的集合,并且糟糕的性能非常糟糕。我在四个集合中的每一个中都插入了不同的信息,因此这是对数据库的大量操作。

我正在考虑以这样的格式表示数据,其中设置了单词和用户数组。

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

这背后的想法是减少数据库操作的数量。因此,对于算法的每个循环,我只为每个集合执行一次更新。但是,我不确定如何对此执行更新/更新,因为在算法的每个循环中,我可能需要插入一个新单词、用户或两者。

任何人都可以推荐一种更新此文档的方法,或者任何人都可以建议替代模式吗?

谢谢

4

2 回答 2

0

我正在使用 MongoDB 插入 1.05 亿条记录,每个记录约 10 个属性。我没有使用更改更新此数据集,而是删除并重新插入所有内容。我发现这种方法比单独触摸每一行以查看它是否是我需要更新的要快。如果您创建 JSON 格式的文本文件并使用 MongoDB 的 mongoimport 工具,您将获得更快的插入速度。

  1. 将数据格式化为 JSON txt 文件(每个集合一个文件)
  2. mongoimport 每个文件并指定要插入的集合
于 2011-08-09T14:30:19.240 回答
0

Upsert 非常适合动态扩展文档。不幸的是,我发现只有在更新对象中有原子修饰符操作时它才能正常工作。就像这里的 $addToSet (mongo shell 代码):

db.words 为空。使用 upsert 添加给定日期的第一个文档。

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