需求
mongodb 里有一个字段,比如tags,有多个来源,来源都是数组,需要插入并去重。
直观的方法是查询后去重,然后更新回去。
网上看到还有 addToSet 这个命令。
用两种方法都做了测试。
先建一个临时表
s = [i for i in range(10000)]
for i in range(10000):
db['test'].insert_one({'test_set': s})
方法 1
查询 /用旧列表和新列表合并 /更新
s = [i for i in range(0, 20000, 2)]
for i in db['test'].find():
i['test_set'] = sorted(set(i['test_set']) | set(s))
db['test'].update_one({'_id': i['_id']},
{'$set': {'test_set': i['test_set']}})
方法 2
网上看到的,用 addToSet。
s = [i for i in range(0, 20000, 2)]
for i in db['test'].find():
i['test_set'] = sorted(set(i['test_set']) | set(s))
db['test'].update_one({'_id': i['_id']},
{'$addToSet': {'test_set': {'$each': s}}})
结论
方法 2 超级超级慢,可能是 each 之后做了太多次查重导致的。
本来还以为都在数据库端处理可能会快点,失败。
跟大家分享下实验结果。
如果有其它好的方法欢迎讨论。
