我正在尝试将一些大文件(大约400万条记录)推送到mongo实例中。我基本上想要实现的是使用文件中的数据更新现有数据。该算法看起来像:
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'之外的整行,如果行不在mongo中则添加新行或更新包含'tsUpdated'的整行......这是算法
问题是:从mongo的角度来看,这可以更快,更容易,更有效吗? (最终有某种批量插入)
答案 0 :(得分: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倍(取决于插入量与更新量)。