web-dev-qa-db-ja.com

MongoDBでは、nullを含むフィールドに一意の部分インデックスを作成できません

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" }
1
Miguel

以下のクエリを使用して、一意の部分インデックスを作成してください。クエリが機能する理由は、{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 })
1
Mani

したがって、私の理論は、型が '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"
        ]
      }
    }
  }
)
0
barrypicker