2012-12-04 61 views
0

我的JSON文档(称为“我”)有子文档(称为“元素”)。 我正在循环这些子文档,并一次更新它们一个。然而,为了做到这一点(一旦我需要的值被计算出来),我有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”,然后通过它的时间标记子文档(它是唯一的每个子文档)识别整个文档。我需要找到比这更快的方法。感谢您的帮助。

+0

你需要更新每个文件N次(每个元素)?为什么不更新蟒蛇整个文档,然后做整体结构的单一db.stuff.update? –

回答

1

您对收藏品有哪些索引?这可能可以通过在嵌入式文档上创建索引来加快。你可以用点符号来做到这一点 - 有一个很好的解释和例子here

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

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

这会让你通过搜索嵌入文档运行得更快。

+0

他在哪里,通过嵌入文档的搜索? –

1
  1. 你的更新是基于ID(我假设它是从蒙戈的默认_id DIFF) 穿上指数在你的id字段

  2. 您要设置新的领域的集合或范围内的所有文件想只为符合给定条件的一些匹配收集做到这一点?如果只是为了匹配的集合,使用查询运算符(具有索引如果可能的话)

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

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