pymongo:更高效的更新

4 投票
1 回答
4921 浏览
提问于 2025-04-16 04:42

我正在尝试将一些大文件(大约有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的角度来看,有没有更快、更简单、更高效的方法来实现这个过程?(可能可以使用某种批量插入的方式)

1 个回答

6

orderId上创建一个唯一索引,并结合一个更新查询,同时检查itemWeight是否发生了变化。这个唯一索引的作用是,如果orderId已经存在且itemWeight没有变化,就会阻止仅仅修改时间戳的插入操作。

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

我的测试显示,相比于你的算法,性能提升了5到10倍(具体取决于插入和更新的数量)。

撰写回答