首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB更新/升级问题-与架构相关

MongoDB更新/升级问题-与架构相关
EN

Stack Overflow用户
提问于 2011-08-05 18:24:23
回答 2查看 831关注 0票数 3

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

代码语言:javascript
复制
{'date':2-1-2011,
'word':word1'
users = [user1, user2, user3, user4]}

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

有固定数量的日期,大约200个;每个日期可能有100k+单词;以及100k+用户。

我使用如下算法插入记录:

代码语言:javascript
复制
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')

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

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

代码语言:javascript
复制
{'date':'26-6-2011',
 'words': [
'word1': ['user1', 'user2'],
'word2': ['user1']
'word1': ['user1', 'user2', 'user3']]}

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

有没有人能推荐一种更新文档的方法,或者有没有人能推荐一种替代的模式?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2011-08-05 19:51:12

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

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

代码语言:javascript
复制
var query = { 'date' : 'date1' }                        
var update = { $addToSet: { 'words.word1' :  'user1' } }
db.words.update(query,update,true,false)                

检查对象。

代码语言:javascript
复制
db.words.find();                                        
{ "_id" : ObjectId("4e3bd4eccf7604a2180c4905"), "date" : "date1", "words" : { "word1" : [ "user1" ] } }

现在添加更多用户到第一个单词,并在一个更新中添加另一个单词。

代码语言:javascript
复制
var update = { $addToSet: { 'words.word1' : { $each : ['user2', 'user4', 'user5'] }, 'words.word2': 'user3' } }
db.words.update(query,update,true,false) 

再次检查object。

代码语言:javascript
复制
db.words.find()                                                                                                
{ "_id" : ObjectId("4e3bd7e9cf7604a2180c4907"), "date" : "date1", "words" : { "word1" : [ "user1", "user2", "user4", "user5" ], "word2" : [ "user3" ] } }
票数 0
EN

Stack Overflow用户

发布于 2011-08-09 22:30:19

我正在使用MongoDB插入105mil的记录,每个记录有大约10个属性。我只是删除并重新插入所有内容,而不是使用更改来更新此数据集。我发现这种方法比单独接触每一行来查看它是否是我需要更新的行更快。如果你创建JSON格式的文本文件并使用MongoDB的mongoimport工具,你会有更好的插入速度。

JSON

  • 将数据格式化为JSON txt文件(每个文件对应一个文件,并指定要将其插入到

中的集合

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6954860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档