2012-12-04 127 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來了解什麼是實際瓶頸。