PyMongo:一种更高效的更新方法

4

我正在尝试将一些大文件(约4百万条记录)推送到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的角度来看,是否可以更快、更简单、更高效地完成?(最终可能需要使用某种批量插入方式)

1个回答

6

orderId上的唯一索引与更新查询相结合,您还需要检查itemWeight是否有变化。唯一索引会防止只有修改时间戳的插入,如果在已存在orderIditemWeight相同时。

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

我的基准测试表明,在插入与更新的数量方面,您的算法相比我的算法性能提高了5-10倍。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接