更新子文档的更快方法

时间:2012-12-04 18:03:00

标签: python mongodb

我的JSON文档(称为“i”)具有子文档(称为“元素”)。 我正在循环这些子文档并一次更新一个。但是,要这样做(一旦我需要的值被计算),我有mongo扫描数据库中的所有文档,然后通过所有子文档,然后找到它需要更新的子文档。

我有重大的时间问题,因为我有大约3000个文件,这需要大约4分钟。 我想知道是否有更快的方法来做到这一点,没有mongo必须扫描所有文件,但在循环内完成。

以下是代码:

for i in db.stuff.find():

    for element in i['counts']:

        computed_value = element[a] + element[b]
        db.stuff.update({'id':i['id'], 'counts.timestamp':element['timestamp']}, 
                        {'$set': {'counts.$.total':computed_value}})

我通过“id”识别整个文档,然后通过其时间戳识别子文档(每个子文档都是唯一的)。我需要找到比这更快的方法。谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

您对收藏品有哪些索引?这可能通过在嵌入式文档上创建索引来加速。您可以使用点表示法执行此操作 - 这是一个很好的解释和示例here

在你的情况下,你会做类似

的事情
db.stuff.ensureIndex( { "i.elements.timestamp" : 1 });

这将使您对嵌入式文档的搜索运行得更快。

答案 1 :(得分:1)

  1. 您的更新基于id(我假设它是来自mongo的默认_id的差异) 将索引放在您的id字段

  2. 您想为集合中的所有文档设置新字段,还是只想将某些匹配集合设置为给定条件?如果仅用于匹配集合,请使用查询运算符(如果可能,使用索引)

  3. 不要获取完整文档,只获取正在使用的字段。

  4. 你的平均文件大小是多少?使用explain和mongostat来了解什么是实际的瓶颈。