2014-12-24 47 views
0

我正在使用mongodb 2.6.1。但是,我無法用稀疏創建唯一索引。目前,我有以下指標:無法使用mongodb創建唯一索引

> db.products.getIndexes() 
[ 
    { 
     "v" : 1, 
     "key" : { 
      "_id" : 1 
     }, 
     "name" : "_id_", 
     "ns" : "snapyshop_production.products" 
    }, 
    { 
     "v" : 1, 
     "key" : { 
      "pickup_location" : "2dsphere" 
     }, 
     "name" : "pickup_location_2dsphere", 
     "background" : true, 
     "ns" : "snapyshop_production.products", 
     "2dsphereIndexVersion" : 2 
    }, 
    { 
     "v" : 1, 
     "key" : { 
      "category_id" : 1 
     }, 
     "name" : "category_id_1", 
     "background" : true, 
     "ns" : "snapyshop_production.products" 
    }, 
    { 
     "v" : 1, 
     "key" : { 
      "_keywords" : 1 
     }, 
     "name" : "_keywords_1", 
     "background" : true, 
     "ns" : "snapyshop_production.products" 
    } 
] 

但是當我運行此命令時,它打印出錯誤:

> db.products.ensureIndex({ source_url: 1 }, { background: true, sparse: true, unique: true }) 
{ 
    "createdCollectionAutomatically" : false, 
    "numIndexesBefore" : 4, 
    "ok" : 0, 
    "errmsg" : "E11000 duplicate key error index: snapyshop_production.products.$source_url_1 dup key: { : null }", 
    "code" : 11000 
} 

我真的不知道如何解決它。

回答

2

您正在創建的稀疏索引將允許多個文檔在沒有source_url字段的情況下存在,但仍將只允許一個文檔所在的字段的值爲null。換句話說,稀疏索引不會將null值的情況視爲任何不同的情況,而僅僅是缺少的字段情況。

所以來處理你的問題,是更新您的收藏從現有文檔中刪除source_url領域,其中它的值是null創建索引之前的典型方式:

db.products.update({source_url: null}, {$unset: {source_url: true}}, {multi: true}) 

然後使用您的程序邏輯中缺少該字段作爲您的null指標。

+0

感謝您的優秀回答! – Chamnap