MongoDB 3.6.9(Ubuntuを使用)を使用して、rss_id
という名前の1つのフィールドを含むドキュメントのセットを保存しています。一部のドキュメントでは、このフィールドの値は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}}}
)
または、次に示すように、一意のインデックスとともに sparse index オプションを使用できます
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"
]
}
}
}
)