2010-09-28 61 views
4

我試圖將一些大文件(大約400萬條記錄)推送到mongo實例中。我基本上試圖實現的是用文件中的數據更新現有的數據。該算法看起來是這樣的:pymongo:更高效的更新

rowHeaders = ('orderId', 'manufacturer', 'itemWeight') 
for row in dataFile: 
    row = row.strip('\n').split('\t') 
    row = dict(zip(rowHeaders, row)) 

    mongoRow = mongoCollection.find({'orderId': 12344}) 
    if mongoRow is not None: 
     if mongoRow['itemWeight'] != row['itemWeight']: 
      row['tsUpdated'] = time.time() 
    else: 
     row['tsUpdated'] = time.time() 

    mongoCollection.update({'orderId': 12344}, row, upsert=True) 

因此,更新全行除了「tsUpdated」如果權重都是一樣的,添加新行,如果該行不蒙戈或更新整個行包括「tsUpdated」 ...這是算法

問題是:從mongo的角度來看,這可以做得更快,更簡單,更高效嗎? (最終通過某種批量插入)

回答

5

orderId上的唯一索引與更新查詢組合在一起,其中還檢查itemWeight中的更改。如果orderId已經存在,並且itemWeight是相同的,則唯一索引可防止只有修改時間戳的插入。

mongoCollection.ensure_index('orderId', unique=True) 
mongoCollection.update({'orderId': row['orderId'], 
    'itemWeight': {'$ne': row['itemWeight']}}, row, upsert=True) 

我的基準測試顯示,根據您的算法(取決於插入量與更新量),性能提高5-10倍。