2014-12-24 5 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 поле из существующих Docs, где его значение null перед созданием индекса:

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

И затем использовать отсутствие поля в качестве индикатора null в вашей программной логике.

+0

Спасибо за отличный ответ! – Chamnap

Смежные вопросы