【问题标题】:MongoDB Update / Upsert Question - Schema RelatedMongoDB 更新 / Upsert 问题 - 架构相关
【发布时间】:2011-08-09 22:30:19
【问题描述】:

我在 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']]}

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

谁能推荐一种更新此文档的方法,或者任何人都可以推荐一个替代架构?

谢谢

【问题讨论】:

  • 出于好奇:您的表现在哪些方面很糟糕?写性能还是查询?
  • @deadsven,写入和更新性能。查询很快,但写入和更新对我来说表现不佳。

标签: schema mongodb pymongo document-oriented-db


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    1. 将您的数据格式化为 JSON txt 文件(每个集合一个文件)
    2. mongoimport 每个文件并指定要插入的集合

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-05
      • 2011-11-20
      • 2012-10-25
      • 2021-07-06
      • 2012-11-11
      • 1970-01-01
      相关资源
      最近更新 更多