Python pymongo:更高效的更新

Python pymongo:更高效的更新,python,mongodb,pymongo,Python,Mongodb,Pymongo,我正在尝试将一些大文件(大约400万条记录)推送到mongo实例中。我基本上是想用文件中的数据更新现有的数据。该算法类似于: rowHeaders = ('orderId', 'manufacturer', 'itemWeight') for row in dataFile: row = row.strip('\n').split('\t') row = dict(zip(rowHeaders, row)) mongoRow = mongoCollection.find

我正在尝试将一些大文件(大约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的角度来看,这能更快、更容易、更高效地完成吗?(最终使用某种批量插入)

orderId
上的唯一索引与更新查询相结合,在更新查询中,您还可以检查
itemWeight
中的更改。如果
orderId
已经存在且
itemWeight
相同,则唯一索引可防止仅使用修改的时间戳进行插入

mongoCollection.ensure_index('orderId', unique=True)
mongoCollection.update({'orderId': row['orderId'],
    'itemWeight': {'$ne': row['itemWeight']}}, row, upsert=True)
我的基准测试显示,与您的算法相比,性能提高了5-10倍(取决于插入和更新的数量)