我有一个名为englishWords的集合,唯一索引是“word”字段。 当我这样做时
<div class='octagonWrap'>
<div class='octagon'></div>
</div>
我收到此错误消息
pymongo.errors.DuplicateKeyError: E11000 duplicate key error index: tongler.englishWords.$word_1 dup key: { : "Harry" },但在插入第一个现有单词时停止插入。
我不想实现检查存在,我想使用唯一索引的好处没有问题。
答案 0 :(得分:2)
为了避免不必要的异常处理,你可以做一个upsert:
from pymongo import MongoClient
tasovshik = MongoClient()
db = tasovshik.tongler
coll = db.englishWords
for word in f.read().split():
coll.replace_one({'word': word}, {'word': word}, True)
最后一个参数指定MongoDB应该插入值,如果它尚不存在。
编辑:为了获得更长的单词列表更快的表现,你可以像这样批量进行:
from pymongo import MongoClient
tasovshik = MongoClient()
db = tasovshik.tongler
coll = db.englishWords
bulkop = coll.initialize_unordered_bulk_op()
for word in f.read().split():
bulkop.find({'word':word}).upsert()
bulkop.execute()
答案 1 :(得分:1)
您可以执行以下操作:
for word in f.read().split():
try:
coll.insert( { "word": word } } )
except pymongo.errors.DuplicateKeyError:
continue
这会忽略错误。
而且,你在尝试之前放弃了这个系列吗?
答案 2 :(得分:0)
我只是运行你的代码,除了你在最后一行有一个额外的}
之外,一切看起来都不错。删除它,你不会丢弃任何集合。每个insert
,创建自己的一批数据,因此不需要删除以前的集合。
好吧,错误消息指示已插入密钥Harry
,并且您尝试使用相同的密钥再次插入。看起来这不是你的整个代码吗?