복붙노트

[MONGODB] MongoDB를 / 몽구스 :없는 경우는 null 독특한

MONGODB

MongoDB를 / 몽구스 :없는 경우는 null 독특한

이 독특한 수집 항목을 강제하는 방법입니다하지만 항목이 널 (null)이 아닌 경우에만 있는지 궁금 해서요. 이자형 샘플 스키마 :

var UsersSchema = new Schema({
    name  : {type: String, trim: true, index: true, required: true},
    email : {type: String, trim: true, index: true, unique: true}
});

이 경우 '이메일'은 필요하지 않지만 '이메일'저장하면 내가 (데이터베이스 수준)이 항목이 고유 있는지 확인하려면.

빈 항목이없는 이메일과 모든 항목이 '독특한'옵션으로 충돌 때문에 (아무 이메일로 다른 사용자가있는 경우) 값 '널'을 얻을 것으로 보인다.

지금은 응용 프로그램 수준에서 그것을 해결하지만,이 DB 쿼리를 저장 싶어요.

고마워

해결법

  1. ==============================

    1.MongoDB를의 V1.8의로서 당신은 고유 값을 보장하지만 인덱스를 정의 할 때 true로 스파 스 옵션을 설정하여 필드없이 여러 문서를 허용 원하는 동작을 얻을 수 있습니다 +. 마찬가지로 :

    MongoDB를의 V1.8의로서 당신은 고유 값을 보장하지만 인덱스를 정의 할 때 true로 스파 스 옵션을 설정하여 필드없이 여러 문서를 허용 원하는 동작을 얻을 수 있습니다 +. 마찬가지로 :

    email : {type: String, trim: true, index: true, unique: true, sparse: true}
    

    또는 셸에서 :

    db.users.ensureIndex({email: 1}, {unique: true, sparse: true});
    

    독특한 스파 스 인덱스가 여전히 null 값, 이메일 필드가없는 경우에만 여러 문서와 이메일 필드에 여러 문서를 허용하지 않습니다.

    http://docs.mongodb.org/manual/core/index-sparse/ 참조

  2. ==============================

    2.네, 독특한 "실제"값을 적용하면서, 필드를 NULL로 설정 여부를 정의와 여러 문서를 가질 수 있습니다.

    네, 독특한 "실제"값을 적용하면서, 필드를 NULL로 설정 여부를 정의와 여러 문서를 가질 수 있습니다.

    요구 사항 :

    당신이 세부 사항에 관심이없는 경우, 구현 섹션으로 넘어가 셔도됩니다.

    놀란의 대답 @ 보완하기 위해, MongoDB를 시작으로 당신이 필터 식으로 부분적인 고유 인덱스를 사용할 수 있습니다 V3.2.

    부분 필터 표현은 제한이있다. 그것은 단지 다음을 포함 할 수 있습니다 :

    이 수단은 사소한 표현 { "yourField"{$ NE : 널 (null)}}이 있음을 사용할 수 없습니다.

    그러나, 당신의 분야는 항상 같은 종류를 사용하는 가정, 당신은 $ 형 식을 사용할 수 있습니다.

    { field: { $type: <BSON type number> | <String alias> } }
    

    MongoDB를 V3.6의 배열로 전달 될 수있는 여러 가능한 유형을 특정하기위한 지원을 추가 :

    { field: { $type: [ <BSON type1> , <BSON type2>, ... ] } }
    

    이 허용 값은 여러 유형하지 널의 수 중 어느 하나 일 수있는 방법.

    우리는, 바이너리 데이터 값을 두 문자열을 수락하거나, 말을 아래의 예에서 이메일 필드를 허용 할 경우에 따라서 적절한 $ 유형 표현은 다음과 같습니다

    {email: {$type: ["string", "binData"]}}
    

    당신은 몽구스 스키마를 지정할 수 있습니다 :

    const UsersSchema = new Schema({
      name: {type: String, trim: true, index: true, required: true},
      email: {
        type: String, trim: true, index: {
          unique: true,
          partialFilterExpression: {email: {$type: "string"}}
        }
      }
    });
    

    또는 직접 (기본 Node.js를 드라이버를 사용) 컬렉션에 추가합니다 :

    User.collection.createIndex("email", {
      unique: true,
      partialFilterExpression: {
        "email": {
          $type: "string"
        }
      }
    });
    

    collection.createIndex를 사용하여

    db.collection('users').createIndex({
        "email": 1
      }, {
        unique: true,
        partialFilterExpression: {
          "email": {
            $type: "string"
          }
        }
      },
      function (err, results) {
        // ...
      }
    );
    

    db.collection.createIndex를 사용하여 :

    db.users.createIndex({
      "email": 1
    }, {
      unique: true, 
      partialFilterExpression: {
        "email": {$type: "string"}
      }
    })
    

    이것은하지만 동일한 이메일 문자열, 널 이메일로 여러 레코드를 삽입 할 수 있도록, 또는 모두에서 이메일 필드가없는 것입니다.

  3. ==============================

    3.이 주제를 연구하는 사람들에게 그냥 빨리 업데이트합니다.

    이 주제를 연구하는 사람들에게 그냥 빨리 업데이트합니다.

    선택한 대답은 작동하지만 대신 부분 인덱스를 사용하는 것을 고려 할 수 있습니다.

    부분 인덱스에 대한 자세한 DOCO : https://docs.mongodb.com/manual/core/index-partial/

  4. ==============================

    4.사실, 필드와 "이메일"존재하지 않는 경우에만 첫 번째 문서가 성공적으로 저장 얻을 것이다. "이메일"오류 (아래 코드 참조) 제공하면서 실패 존재하지 않는 경우 이후는 절약 할 수 있습니다. 고유 인덱스에 대한 존중과 http://www.mongodb.org/display/DOCS/Indexes#Indexes-UniqueIndexes 여기 키를 누락과 MongoDB를 공식 문서에서 이유보기하십시오.

    사실, 필드와 "이메일"존재하지 않는 경우에만 첫 번째 문서가 성공적으로 저장 얻을 것이다. "이메일"오류 (아래 코드 참조) 제공하면서 실패 존재하지 않는 경우 이후는 절약 할 수 있습니다. 고유 인덱스에 대한 존중과 http://www.mongodb.org/display/DOCS/Indexes#Indexes-UniqueIndexes 여기 키를 누락과 MongoDB를 공식 문서에서 이유보기하십시오.

      // NOTE: Code to executed in mongo console.
    
      db.things.ensureIndex({firstname: 1}, {unique: true});
      db.things.save({lastname: "Smith"});
    
      // Next operation will fail because of the unique index on firstname.
      db.things.save({lastname: "Jones"});
    

    정의에 고유 인덱스는 하나 개의 값이 한 번만 저장 될 수 있습니다. 당신은 하나 개의 값으로 널 (null)을 고려하면 한 번만 삽입 할 수 있습니다! 당신은 보장하고 애플리케이션 수준에서의 유효성을 검사하여 접근 정확합니다. 즉,이 할 수있는 방법이다.

    또한 http://www.mongodb.org/display/DOCS/Querying+and+nulls을 숙지하실 수 있습니다

  5. from https://stackoverflow.com/questions/7955040/mongodb-mongoose-unique-if-not-null by cc-by-sa and MIT license