Index
MongoDB 不允許在包含 null 的欄位中創建唯一的部分索引
我正在使用 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" ] } } } )