Python 更新子文档的快速方法

Python 更新子文档的快速方法,python,mongodb,Python,Mongodb,我的JSON文档(称为“i”)有子文档(称为“元素”)。 我正在循环处理这些子文档,并一次更新一个。但是,要做到这一点(一旦计算出所需的值),我需要mongo扫描数据库中的所有文档,然后扫描所有子文档,然后找到它需要更新的子文档 我有重大的时间问题,因为我有约3000份文件,这大约需要4分钟。 我想知道是否有一种更快的方法可以做到这一点,mongo不必扫描所有文档,而是在循环中进行扫描 代码如下: for i in db.stuff.find(): for element in i['

我的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”标识整个文档,然后通过其时间戳(每个子文档都是唯一的)标识子文档。我需要找到比这更快的方法。谢谢您的帮助。

您的收藏有哪些索引?通过在嵌入文档上创建索引,这可能会加快速度。您可以使用点符号来实现这一点——这里有一个很好的解释和示例

在你的情况下,你会这样做

db.stuff.ensureIndex( { "i.elements.timestamp" : 1 });
这将使您在嵌入式文档中的搜索运行得更快

  • 您的更新基于id(我假设它与mongo的默认id不同) 将索引放在id字段上

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

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

  • 您的平均文档大小是多少?使用explain和mongostat了解实际瓶颈是什么


  • 他在哪里搜索嵌入的文档?是否需要更新每个文档N次(针对每个元素)?为什么不用python更新整个文档,然后对整个结构执行单个db.stuff.update?