【问题标题】:why DuplicateKeyError: E11000 duplicate key error index: test.test.$notification_1 dup key: { : null }为什么 DuplicateKeyError: E11000 duplicate key error index: test.test.$notification_1 dup key: { : null }
【发布时间】:2012-06-07 11:29:29
【问题描述】:

我创建这样的唯一索引:

self.db_database[co_name].ensure_index([('src_md5',-1),('src_time',-1),('src_size',-1)],unique=True)
self.db_database[co_name].ensure_index(('notification'),unique=True)
self.db_database[co_name].ensure_index(('version'),unique=True)`  

在插入之前我创建一条记录如下:

self.db_database[co_name].insert({"notification":"yes","file_md5":-1,"file_size":-1,"file_time":-1,"bypass":0,"server_list":[],"ok_to_download":0,"force_to_download":-1,"idx":0},safe=True)`  

然后我插入一些这样的信息:

collection.insert({"src_host":src_host,"src_path":src_path,"src_name":src_name,"src_md5":src_md5,"src_time":src_time,"src_size":src_size,"version":idx},safe=True)`  

它会引发错误:

DuplicateKeyError: E11000 duplicate key error index: data_transfer.nova_mon_test.log.small_20120517202918765432.$notification_1  dup key: { : null } 

为什么?

【问题讨论】:

    标签: python mongodb pymongo


    【解决方案1】:

    您的集合中可能已经有一个文档,该文档要么具有notification: NULL,要么具有未设置通知字段的文档。如果未设置字段,则将其视为空。因为唯一索引每个字段只允许一个值,所以不能有两个没有字段集的文档。您也可以通过在创建索引时使用sparse 选项来解决此问题。这样的事情应该可以工作(在删除notification上已经存在的索引之后:

    self.db_database[co_name].ensure_index(('notification'),unique=True,sparse=True)
    

    另请参阅:sparse indexes and null values in mongo

    【讨论】:

    猜你喜欢
    • 2022-01-05
    • 2020-08-13
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 2018-10-02
    • 2015-06-01
    • 2022-11-02
    • 2020-09-02
    相关资源
    最近更新 更多