当前位置:  开发笔记 > 编程语言 > 正文

pymongo:更有效的更新

如何解决《pymongo:更有效的更新》经验,为你挑选了1个好方法。

我试图将一些大文件(大约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> 小智..:

将唯一索引orderId与更新查询相结合,您还可以在其中检查更改itemWeight.唯一索引会阻止仅具有已修改时间戳的插入(如果该插入orderId已存在且itemWeight相同).

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

我的基准测试显示您的算法性能提高了5-10倍(取决于插入量与更新量).

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有