복붙노트

[MONGODB] 몽구스 고유 색인 작동하지 않습니다!

MONGODB

몽구스 고유 색인 작동하지 않습니다!

나는 MongoDB를이 인덱스를 기반으로 중복 값을 감지 할 수 있도록 노력하고있어. 나는 이것이 MongoDB를에 가능하다고 생각하지만, 몽구스 래퍼를 통해 일들이 깨진 것으로 나타났습니다. 이 같은 뭔가 이렇게 :

User = new Schema ({
  email: {type: String, index: {unique: true, dropDups: true}}
})

나는 동일한 이메일로이 사용자를 저장할 수 있습니다. 꿰매다.

같은 문제는 여기에 표현되었습니다 https://github.com/LearnBoost/mongoose/issues/56하지만 스레드는데도 오래되고 리드입니다.

지금, 나는 수동으로 사용자를 찾기 위해 DB를 호출하는거야. "이메일"인덱스되기 때문에 그 전화는 비용이 아니다. 그러나 여전히 기본적으로 처리 할 수 ​​있도록 좋은 것입니다.

사람이에 대한 해결책이 있습니까?

해결법

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

    1.아차! 당신은 몽고를 다시 시작해야합니다.

    아차! 당신은 몽고를 다시 시작해야합니다.

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

    2.그리고 다시 지수도로 :

    그리고 다시 지수도로 :

    mongo <db-name>
    > db.<collection-name>.reIndex()
    

    나는 중요한 데이터를 가지고 있지 않기 때문에 테스트에서, 당신은 할 수 있습니다 :

    mongo <db-name>
    > db.dropDatabase()
    
  3. ==============================

    3.나는 이미 DB에 추가 된 사용자를 가진 후 우리 UserSchema에 이메일 필드의 고유 제한 조건을 추가, 아직도 속는 이메일로 사용자를 절약 할 수 있었다 : 저도 같은 문제로 실행했습니다. 나는 다음을 수행하여이 문제를 해결 :

    나는 이미 DB에 추가 된 사용자를 가진 후 우리 UserSchema에 이메일 필드의 고유 제한 조건을 추가, 아직도 속는 이메일로 사용자를 절약 할 수 있었다 : 저도 같은 문제로 실행했습니다. 나는 다음을 수행하여이 문제를 해결 :

    1) 사용자의 컬렉션에서 모든 문서를 제거합니다.

    2) 몽고 쉘에서 다음 명령을 실행합니다 : db.users.createIndex ({이메일 : 1}, {독특한 : TRUE})

    에 대해서는 1 단계, 참고 몽고의 문서에서 :

    https://docs.mongodb.com/manual/core/index-unique/

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

    4.당신이 몽고에 일부 중복 남아있는 경우에도이 문제가 발생합니다. 몽구스는 응용 프로그램이 시작될 때 몽고에서 그들을 만들려고합니다.

    당신이 몽고에 일부 중복 남아있는 경우에도이 문제가 발생합니다. 몽구스는 응용 프로그램이 시작될 때 몽고에서 그들을 만들려고합니다.

    이를 방지하기 위해,이 오류 이런 식으로 처리 할 수 ​​있습니다 :

    yourModel.on('index', function(err) {
      if (err?) {
        console.error err
      }
    );
    
  5. ==============================

    5.좋아, 내가 현장에 인덱스를 추가하고 독특한 속성을 설정하여 mongoshell에서이 문제를 해결 할 수 있었다 :

    좋아, 내가 현장에 인덱스를 추가하고 독특한 속성을 설정하여 mongoshell에서이 문제를 해결 할 수 있었다 :

    db.<collectionName>.ensureIndex({fieldName: 1}, {unique: true});
    

    쉘은이 방법으로 응답해야합니다 :

    {
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
    }
    

    이제 몽고 쉘에서 신속하게 테스트합니다 :

    var doc = {fieldName: 'abc'};
    db.<collectionName>.insert(doc)
    

    제공해야합니다 :     WriteResult ({ "nInserted": 1})

    그러나 다시 반복 할 때 :

    db.<collectionName>.insert(doc)
    

    줄게:

    WriteResult({
        "nInserted" : 0,
        "writeError" : {
            "code" : 11000,
            "errmsg" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: fuelConsumption.users.$email_1  dup key: { : \"martyna@martycud.com\" }"
        }
    })
    
  6. ==============================

    6.응용 프로그램 수준에서 독특한 인덱스를 시행 할 때 몽구스가 좀 느슨; 그러므로, 그것은 하나 당신의 UserSchema 후 다음 코드 줄을 작성하여 고유 인덱스에 대한 당신이있는 거 심각한 몽고 CLI 또는 명시 적으로 말할 몽구스를 사용하여 데이터베이스 자체에서 고유 인덱스를 강제로 선호하는 것 :

    응용 프로그램 수준에서 독특한 인덱스를 시행 할 때 몽구스가 좀 느슨; 그러므로, 그것은 하나 당신의 UserSchema 후 다음 코드 줄을 작성하여 고유 인덱스에 대한 당신이있는 거 심각한 몽고 CLI 또는 명시 적으로 말할 몽구스를 사용하여 데이터베이스 자체에서 고유 인덱스를 강제로 선호하는 것 :

    UserSchema.index ({사용자 이름 : 1, 이메일 : 1}, {독특한는 true});

    이것은 당신의 UserSchema 모두 이름과 이메일 필드에 고유 인덱스를 시행합니다. 건배.

  7. ==============================

    7.문서에 따르면 : https://docs.mongodb.com/v2.6/tutorial/modify-an-index/

    문서에 따르면 : https://docs.mongodb.com/v2.6/tutorial/modify-an-index/

    DO NOT RESTART 몽고!

    1 - 컬렉션을 드롭

    db.users.drop()
    

    2 - 테이블을 인덱싱

    db.users.ensureIndex({email: 1, type: 1}, {unique: true})
    
  8. ==============================

    8.이 같은 짓을했습니다 :

    이 같은 짓을했습니다 :

    const mongoose = require('mongoose');
    const Schema = mongoose.Schema;
    
    const FooSchema = new Schema({
       name: { type: String, required: true, index: true, unique: true }
    });
    
    const Foo = mongoose.model('Foo', FooSchema);
    
    Foo.createIndexes();
    
    module.exports = Foo
    

    나는 Foo.createIndexes 추가 () 라인 주전 코드가있는 실행 된 때 나는 다음과 같은 사용 중단 경고를 얻고 있었다 :

    (node:21553) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.
    

    나는 Foo.createIndexes ()가 비동기이지만, AFAIK 것들이 보일 경우 확인 작업을 할 좋은 아니에요

  9. ==============================

    9.몽구스 고유-검증

    몽구스 고유-검증

    이 플러그인을 사용하는 방법 :

    1) --save 몽구스 고유-유효성 검사기를 설치 NPM

    2) 스키마에이 가이드를 따르십시오 :

    // declare this at the top
    var mongoose = require('mongoose');
    var uniqueValidator = require('mongoose-unique-validator');
    
    // exampleSchema = mongoose.Schema({}) etc...
    
    exampleSchema.plugin(uniqueValidator);
    
    // module.exports = mongoose.model(...) etc....
    

    3) 몽구스 방법

    findOneAndUpdate 같은 방법을 사용하는 경우이 구성 개체를 전달해야합니다 :

    {runValidators : 사실, 상황에 맞는 '쿼리'}

    ie. User.findOneAndUpdate(
          { email: 'old-email@example.com' },
          { email: 'new-email@example.com' },
          { runValidators: true, context: 'query' },
          function(err) {
            // ...
        }
    

    4) 추가 옵션

    지금 당신은 / 추가, 몽고를 다시 시작 데이터베이스를 삭제하거나 인덱스를 만드는 방법에 대해 걱정하지 않고 스키마에 고유 한 속성을 삭제할 수 있습니다.

    (워드 프로세서)주의 사항 :

    우리는 작업이 문서가 데이터베이스에 존재하는지 여부를 확인하는 비동기에 의존하기 때문에 두 개의 질의가 MongoDB를에 다음 모두 삽입을 동시에 실행, 모두 0 다시 가져 오기를하기가 가능합니다.

    자동으로 수집 잠금 또는 단일 연결을 강제로 외부는 진정한 해결책이 없습니다.

    우리의 대부분의 사용자의 경우이 문제가 될 수 있지만,주의해야 할 가장자리 경우가되지 않습니다.

  10. ==============================

    10.또한 인덱스를 삭제하여이 문제를 해결할 수 있습니다;

    또한 인덱스를 삭제하여이 문제를 해결할 수 있습니다;

    하자 당신이 입력, 수집 사용자와 필드 이름에서 고유 인덱스를 제거 할 가정 :

    db.users.dropIndex ( '님');

  11. ==============================

    11.테이블 / 모음이 비어있는 경우, 다음 필드에 대한 고유 인덱스를 만들 :

    테이블 / 모음이 비어있는 경우, 다음 필드에 대한 고유 인덱스를 만들 :

    db.<collection_name>.createIndex({'field':1}, {unique: true})
    

    테이블 / 컬렉션 비어 있지 않은 경우, 다음 컬렉션을 삭제하고 인덱스를 만들 :

    db.<collection_name>.drop()
    db.<collection_name>.createIndex({'field':1}, {unique: true})
    

    이제 MongoDB를 다시 시작합니다.

  12. ==============================

    12.최신 답 : MongoDB의를 다시 시작할 필요가 전혀 없다, colleciton 이미 같은 이름의 인덱스가있는 경우, 몽구스는 다시하지 않을 것이다 다시, 그래서 드롭 colleciton의 기존 인덱스 첫째로 당신의 인덱스, 당신은 몽구스를 실행할 때 지금, 그것은, 새로운 인덱스를 생성합니다 위의 과정은 내 문제를 해결했다.

    최신 답 : MongoDB의를 다시 시작할 필요가 전혀 없다, colleciton 이미 같은 이름의 인덱스가있는 경우, 몽구스는 다시하지 않을 것이다 다시, 그래서 드롭 colleciton의 기존 인덱스 첫째로 당신의 인덱스, 당신은 몽구스를 실행할 때 지금, 그것은, 새로운 인덱스를 생성합니다 위의 과정은 내 문제를 해결했다.

  13. ==============================

    13.스키마의 자동 색인은 사실 확인, 그것은 어쩌면 세트 거짓 (기본값은 TRUE)는 mongoose.connect 옵션을 사용할 때

    스키마의 자동 색인은 사실 확인, 그것은 어쩌면 세트 거짓 (기본값은 TRUE)는 mongoose.connect 옵션을 사용할 때

  14. ==============================

    14.이 옵션 자동 색인을 사용하는 경우이 같은 연결 방법에 거짓 :

    이 옵션 자동 색인을 사용하는 경우이 같은 연결 방법에 거짓 :

    mongoose.connect (CONNECTION_STRING, {자동 색인 : 거짓});

    그 제거하십시오. 즉,하지 작업을 수행하는 경우이 스레드에서 제안 된 많은으로하여 MongoDB를 다시 시작하십시오.

  15. ==============================

    15.당신은 당신의 스키마를 정의 할 수 있습니다

    당신은 당신의 스키마를 정의 할 수 있습니다

    User = new Schema ({
      email: {
          type: String,
          unique: true
      }
    })
    

    거기에 이미 문서이며 그 후, 당신은 사용자의 스키마를 변경 한 때 어쩌면이 작동하지 않습니다. 당신이 컬렉션을 드롭하지 않으려면이 사용자 수집을 위해 이메일에 인덱스를 만들 수 있습니다. 이 명령을 사용하면 이메일에 인덱스를 만들 수 있습니다.

    db.User.createIndex({email:1},{unique: true})
    

    아니면 그냥 컬렉션을 삭제하고 다시 사용자를 추가 할 수 있습니다. 컬렉션을 삭제를 들어, 다음을 입력 할 수 있습니다 :

    db.User.drop()
    
  16. ==============================

    16.나는 잠시 같은 문제에 직면하고 검색을 많이했고, 나를 위해 솔루션은 createIndexes () 함수이다.

    나는 잠시 같은 문제에 직면하고 검색을 많이했고, 나를 위해 솔루션은 createIndexes () 함수이다.

    나는이 도움 바랍니다.

    그래서 코드는 그렇게 될 것입니다.

    User = new Schema ({
       email: {type: String, unique: true}
    });
    User.createIndexes();
    
  17. ==============================

    17.나는이 문제가 발생했을 때, 나는 여러 번 데이터베이스, 다시 시작하는 서버 (nodemon를) 삭제 시도 트릭의 아무도 전혀 일을하지 않았다. 나는 로보 3T를 통해 다음과 같은 작업 주위를 발견 :

    나는이 문제가 발생했을 때, 나는 여러 번 데이터베이스, 다시 시작하는 서버 (nodemon를) 삭제 시도 트릭의 아무도 전혀 일을하지 않았다. 나는 로보 3T를 통해 다음과 같은 작업 주위를 발견 :

    이 없는지를 중복 이메일은 MongoDB에 저장되어 있는지 확인합니다.

  18. from https://stackoverflow.com/questions/5535610/mongoose-unique-index-not-working by cc-by-sa and MIT license