我在用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']]}这背后的想法是减少数据库操作的数量。因此,对于算法的每个循环,我只对每个集合执行一次更新。但是,我不确定如何对此执行更新/更新插入,因为在算法的每个循环中,我可能需要插入一个新词、用户或两者。
有没有人能推荐一种更新文档的方法,或者有没有人能推荐一种替代的模式?
谢谢
发布于 2011-08-05 19:51:12
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) 再次检查object。
db.words.find()
{ "_id" : ObjectId("4e3bd7e9cf7604a2180c4907"), "date" : "date1", "words" : { "word1" : [ "user1", "user2", "user4", "user5" ], "word2" : [ "user3" ] } }发布于 2011-08-09 22:30:19
我正在使用MongoDB插入105mil的记录,每个记录有大约10个属性。我只是删除并重新插入所有内容,而不是使用更改来更新此数据集。我发现这种方法比单独接触每一行来查看它是否是我需要更新的行更快。如果你创建JSON格式的文本文件并使用MongoDB的mongoimport工具,你会有更好的插入速度。
JSON
中的集合
https://stackoverflow.com/questions/6954860
复制相似问题