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

MongoDB가 인덱스를 기반으로 중복 값을 감지하도록하려고합니다. MongoDB에서 이것이 가능하다고 생각하지만 Mongoose 래퍼를 통해 모든 것이 깨진 것처럼 보입니다. 그래서 다음과 같이 :

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

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

https://github.com/LearnBoost/mongoose/issues/56 에서 동일한 문제가 표현 되었지만 해당 스레드는 오래되어 아무데도 없습니다.

지금은 사용자를 찾기 위해 수동으로 db를 호출하고 있습니다. 이 호출은 “이메일”이 인덱싱되므로 비용이 많이 들지 않습니다. 그러나 기본적으로 처리되도록하는 것이 여전히 좋습니다.

누구든지 이것에 대한 해결책이 있습니까?



답변

이런! mongo를 다시 시작하면됩니다.


답변

이런! mongo를 다시 시작하면됩니다.

또한 다음을 사용하여 다시 색인화합니다.

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

테스트에서 중요한 데이터가 없기 때문에 다음을 수행 할 수도 있습니다.

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


답변

같은 문제에 부딪 혔습니다. 이미 db에 사용자를 추가 한 후 email필드에 대한 고유 한 제약 조건을 추가했으며 UserSchema여전히 중복 이메일로 사용자를 저장할 수있었습니다. 다음을 수행하여이 문제를 해결했습니다.

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

2) mongo 셸에서 다음 명령을 실행합니다.
db.users.createIndex({email: 1}, {unique: true})

1 단계와 관련하여 Mongo의 문서에서 다음 사항에 유의하십시오.

MongoDB는 컬렉션에 인덱스에 대한 고유 제약 조건을 위반하는 데이터가 이미 포함되어있는 경우 지정된 인덱스 필드에 고유 인덱스를 만들 수 없습니다.

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


답변

이 동작은 Mongo에 일부 중복 항목을 남긴 경우에도 발생합니다. Mongoose는 애플리케이션이 시작될 때 Mongo에서 생성을 시도합니다.

이를 방지하려면 다음과 같이이 오류를 처리 할 수 ​​있습니다.

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


답변

좋아, 필드에 인덱스를 추가하고 고유 속성을 설정하여 mongoshell에서이 문제를 해결할 수있었습니다.

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

Shell은 다음과 같이 응답해야합니다.

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

이제 mongoshell에서 빠르게 테스트합니다.

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\" }"
    }
})


답변

다음과 같이했습니다.

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()코드가 실행될 때 다음과 같은 사용 중단 경고가 표시되는 bc 줄을 추가 했습니다.

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

Foo.createIndexes()비동기 인지 확실하지 않지만 AFAIK가 제대로 작동하는 것 같습니다.


답변

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

기존 색인을 수정하려면 색인을 삭제하고 다시 작성해야합니다.

MONGO를 다시 시작하지 마십시오!

1-컬렉션 삭제

db.users.drop()

2-테이블 재색 인

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