0

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

4

2 回答 2

1

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

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

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

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

于 2012-12-04T21:09:49.450 回答
1
  1. 您的更新基于 id (我假设它与 mongo 的默认 _id 不同)将索引放在您的 id 字段上

  2. You want to set new field for all documents within collection or want to do it only for some matching collection to given criteria? if only for matching collections, use query operator (with index if possible)

  3. dont fetch full document, fetch only those fields which are being used.

  4. What is your avg document size? Use explain and mongostat to understand what is actual bottleneck.

于 2012-12-04T21:31:14.020 回答