插入具有Python唯一键的MongoDB集合

时间:2016-01-06 20:16:42

标签: python mongodb mongodb-query pymongo

我有一个名为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" }
,但在插入第一个现有单词时停止插入。

我不想实现检查存在,我想使用唯一索引的好处没有问题。

3 个答案:

答案 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应该插入值,如果它尚不存在。

这是the documentation

编辑:为了获得更长的单词列表更快的表现,你可以像这样批量进行:

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()

取自bulk operations documentation

答案 1 :(得分:1)

您可以执行以下操作:

for word in f.read().split():
    try:
        coll.insert( { "word": word } } )
    except pymongo.errors.DuplicateKeyError:
        continue

这会忽略错误。

而且,你在尝试之前放弃了这个系列吗?

答案 2 :(得分:0)

我只是运行你的代码,除了你在最后一行有一个额外的}之外,一切看起来都不错。删除它,你不会丢弃任何集合。每个insert,创建自己的一批数据,因此不需要删除以前的集合。

好吧,错误消息指示已插入密钥Harry,并且您尝试使用相同的密钥再次插入。看起来这不是你的整个代码吗?