Index

MongoDB 不允許在包含 null 的欄位中創建唯一的部分索引

  • November 8, 2019

我正在使用 MongoDB 3.6.9(使用 Ubuntu)來保存一組文件,其中包含一個名為的欄位rss_id,對於某些文件,該欄位的值為null. 我想在該欄位中創建一個唯一索引並嘗試了此解決方案。從文件來看,這似乎是一個很好的解決方案,但由於某種原因,我無法讓它在我的 MongoDB 中工作。

當我執行以下命令時(我使用的是 Robo 3T 的外殼):

db.getCollection('noticias').createIndex(
  { rss_id: 1},
  { unique:true, partialFilterExpression: {rss_id: {$exists:true }}}
)

我得到錯誤:

{
   "ok" : 0.0,
   "errmsg" : "E11000 duplicate key error collection: newsWall.noticias index: rss_id_1 dup key: { : null }",
   "code" : 11000,
   "codeName" : "DuplicateKey" }

請使用以下查詢來創建唯一的部分索引。您的查詢工作的原因是,可能有許多欄位的值如下{rss_id: null}

db.getCollection('noticias').createIndex(
  { rss_id: 1},
  { unique:true, partialFilterExpression: {rss_id: {$ne:null}}}
)

或者您可以使用稀疏索引選項和唯一索引,如下所示

db.getCollection('noticias').createIndex( { rss_id: 1}, { sparse: true, unique: true })

所以我的理論是使用過濾器表達式創建具有唯一約束的部分索引,以便僅當類型不是“null”類型時,部分索引才會添加條目。我指定了除 null 之外的所有類型來實現這一點。有關類型列表,請參閱https://docs.mongodb.com/manual/reference/operator/query/type/#op._S_type

db.noticias.createIndex(
 { rss_id: 1},
 { 
   unique: true, 
   partialFilterExpression: {
     rss_id: {
       $type: [
         "double",
         "string",
         "object",
         "array",
         "binData",
         "undefined",
         "objectId",
         "bool",
         "date",
         "regex",
         "dbPointer",
         "javascript",
         "symbol",
         "javascriptWithScope",
         "int",
         "timestamp",
         "long",
         "decimal",
         "minKey",
         "maxKey"
       ]
     }
   }
 }
)

引用自:https://dba.stackexchange.com/questions/230768