[MONGODB] 몽구스 고유 색인 작동하지 않습니다!
MONGODB몽구스 고유 색인 작동하지 않습니다!
나는 MongoDB를이 인덱스를 기반으로 중복 값을 감지 할 수 있도록 노력하고있어. 나는 이것이 MongoDB를에 가능하다고 생각하지만, 몽구스 래퍼를 통해 일들이 깨진 것으로 나타났습니다. 이 같은 뭔가 이렇게 :
User = new Schema ({
email: {type: String, index: {unique: true, dropDups: true}}
})
나는 동일한 이메일로이 사용자를 저장할 수 있습니다. 꿰매다.
같은 문제는 여기에 표현되었습니다 https://github.com/LearnBoost/mongoose/issues/56하지만 스레드는데도 오래되고 리드입니다.
지금, 나는 수동으로 사용자를 찾기 위해 DB를 호출하는거야. "이메일"인덱스되기 때문에 그 전화는 비용이 아니다. 그러나 여전히 기본적으로 처리 할 수 있도록 좋은 것입니다.
사람이에 대한 해결책이 있습니까?
해결법
-
==============================
1.아차! 당신은 몽고를 다시 시작해야합니다.
아차! 당신은 몽고를 다시 시작해야합니다.
-
==============================
2.그리고 다시 지수도로 :
그리고 다시 지수도로 :
mongo <db-name> > db.<collection-name>.reIndex()
나는 중요한 데이터를 가지고 있지 않기 때문에 테스트에서, 당신은 할 수 있습니다 :
mongo <db-name> > db.dropDatabase()
-
==============================
3.나는 이미 DB에 추가 된 사용자를 가진 후 우리 UserSchema에 이메일 필드의 고유 제한 조건을 추가, 아직도 속는 이메일로 사용자를 절약 할 수 있었다 : 저도 같은 문제로 실행했습니다. 나는 다음을 수행하여이 문제를 해결 :
나는 이미 DB에 추가 된 사용자를 가진 후 우리 UserSchema에 이메일 필드의 고유 제한 조건을 추가, 아직도 속는 이메일로 사용자를 절약 할 수 있었다 : 저도 같은 문제로 실행했습니다. 나는 다음을 수행하여이 문제를 해결 :
1) 사용자의 컬렉션에서 모든 문서를 제거합니다.
2) 몽고 쉘에서 다음 명령을 실행합니다 : db.users.createIndex ({이메일 : 1}, {독특한 : TRUE})
에 대해서는 1 단계, 참고 몽고의 문서에서 :
https://docs.mongodb.com/manual/core/index-unique/
-
==============================
4.당신이 몽고에 일부 중복 남아있는 경우에도이 문제가 발생합니다. 몽구스는 응용 프로그램이 시작될 때 몽고에서 그들을 만들려고합니다.
당신이 몽고에 일부 중복 남아있는 경우에도이 문제가 발생합니다. 몽구스는 응용 프로그램이 시작될 때 몽고에서 그들을 만들려고합니다.
이를 방지하기 위해,이 오류 이런 식으로 처리 할 수 있습니다 :
yourModel.on('index', function(err) { if (err?) { console.error err } );
-
==============================
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.응용 프로그램 수준에서 독특한 인덱스를 시행 할 때 몽구스가 좀 느슨; 그러므로, 그것은 하나 당신의 UserSchema 후 다음 코드 줄을 작성하여 고유 인덱스에 대한 당신이있는 거 심각한 몽고 CLI 또는 명시 적으로 말할 몽구스를 사용하여 데이터베이스 자체에서 고유 인덱스를 강제로 선호하는 것 :
응용 프로그램 수준에서 독특한 인덱스를 시행 할 때 몽구스가 좀 느슨; 그러므로, 그것은 하나 당신의 UserSchema 후 다음 코드 줄을 작성하여 고유 인덱스에 대한 당신이있는 거 심각한 몽고 CLI 또는 명시 적으로 말할 몽구스를 사용하여 데이터베이스 자체에서 고유 인덱스를 강제로 선호하는 것 :
UserSchema.index ({사용자 이름 : 1, 이메일 : 1}, {독특한는 true});
이것은 당신의 UserSchema 모두 이름과 이메일 필드에 고유 인덱스를 시행합니다. 건배.
-
==============================
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.이 같은 짓을했습니다 :
이 같은 짓을했습니다 :
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.몽구스 고유-검증
몽구스 고유-검증
이 플러그인을 사용하는 방법 :
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.또한 인덱스를 삭제하여이 문제를 해결할 수 있습니다;
또한 인덱스를 삭제하여이 문제를 해결할 수 있습니다;
하자 당신이 입력, 수집 사용자와 필드 이름에서 고유 인덱스를 제거 할 가정 :
db.users.dropIndex ( '님');
-
==============================
11.테이블 / 모음이 비어있는 경우, 다음 필드에 대한 고유 인덱스를 만들 :
테이블 / 모음이 비어있는 경우, 다음 필드에 대한 고유 인덱스를 만들 :
db.<collection_name>.createIndex({'field':1}, {unique: true})
테이블 / 컬렉션 비어 있지 않은 경우, 다음 컬렉션을 삭제하고 인덱스를 만들 :
db.<collection_name>.drop() db.<collection_name>.createIndex({'field':1}, {unique: true})
이제 MongoDB를 다시 시작합니다.
-
==============================
12.최신 답 : MongoDB의를 다시 시작할 필요가 전혀 없다, colleciton 이미 같은 이름의 인덱스가있는 경우, 몽구스는 다시하지 않을 것이다 다시, 그래서 드롭 colleciton의 기존 인덱스 첫째로 당신의 인덱스, 당신은 몽구스를 실행할 때 지금, 그것은, 새로운 인덱스를 생성합니다 위의 과정은 내 문제를 해결했다.
최신 답 : MongoDB의를 다시 시작할 필요가 전혀 없다, colleciton 이미 같은 이름의 인덱스가있는 경우, 몽구스는 다시하지 않을 것이다 다시, 그래서 드롭 colleciton의 기존 인덱스 첫째로 당신의 인덱스, 당신은 몽구스를 실행할 때 지금, 그것은, 새로운 인덱스를 생성합니다 위의 과정은 내 문제를 해결했다.
-
==============================
13.스키마의 자동 색인은 사실 확인, 그것은 어쩌면 세트 거짓 (기본값은 TRUE)는 mongoose.connect 옵션을 사용할 때
스키마의 자동 색인은 사실 확인, 그것은 어쩌면 세트 거짓 (기본값은 TRUE)는 mongoose.connect 옵션을 사용할 때
-
==============================
14.이 옵션 자동 색인을 사용하는 경우이 같은 연결 방법에 거짓 :
이 옵션 자동 색인을 사용하는 경우이 같은 연결 방법에 거짓 :
mongoose.connect (CONNECTION_STRING, {자동 색인 : 거짓});
그 제거하십시오. 즉,하지 작업을 수행하는 경우이 스레드에서 제안 된 많은으로하여 MongoDB를 다시 시작하십시오.
-
==============================
15.당신은 당신의 스키마를 정의 할 수 있습니다
당신은 당신의 스키마를 정의 할 수 있습니다
User = new Schema ({ email: { type: String, unique: true } })
거기에 이미 문서이며 그 후, 당신은 사용자의 스키마를 변경 한 때 어쩌면이 작동하지 않습니다. 당신이 컬렉션을 드롭하지 않으려면이 사용자 수집을 위해 이메일에 인덱스를 만들 수 있습니다. 이 명령을 사용하면 이메일에 인덱스를 만들 수 있습니다.
db.User.createIndex({email:1},{unique: true})
아니면 그냥 컬렉션을 삭제하고 다시 사용자를 추가 할 수 있습니다. 컬렉션을 삭제를 들어, 다음을 입력 할 수 있습니다 :
db.User.drop()
-
==============================
16.나는 잠시 같은 문제에 직면하고 검색을 많이했고, 나를 위해 솔루션은 createIndexes () 함수이다.
나는 잠시 같은 문제에 직면하고 검색을 많이했고, 나를 위해 솔루션은 createIndexes () 함수이다.
나는이 도움 바랍니다.
그래서 코드는 그렇게 될 것입니다.
User = new Schema ({ email: {type: String, unique: true} }); User.createIndexes();
-
==============================
17.나는이 문제가 발생했을 때, 나는 여러 번 데이터베이스, 다시 시작하는 서버 (nodemon를) 삭제 시도 트릭의 아무도 전혀 일을하지 않았다. 나는 로보 3T를 통해 다음과 같은 작업 주위를 발견 :
나는이 문제가 발생했을 때, 나는 여러 번 데이터베이스, 다시 시작하는 서버 (nodemon를) 삭제 시도 트릭의 아무도 전혀 일을하지 않았다. 나는 로보 3T를 통해 다음과 같은 작업 주위를 발견 :
이 없는지를 중복 이메일은 MongoDB에 저장되어 있는지 확인합니다.
from https://stackoverflow.com/questions/5535610/mongoose-unique-index-not-working by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] MongoDB의 : 집계 프레임 워크 : 그룹화 ID 당 마지막 날짜가 문서를 가져 오기 (0) | 2019.12.03 |
---|---|
[MONGODB] MongoDB를 통해 몽고 쉘에서 중첩 된 배열을 업데이트 [중복] (0) | 2019.12.03 |
[MONGODB] MongoDB의 쿼리 여러 컬렉션을 한 번에 (0) | 2019.12.03 |
[MONGODB] 몽구스에서 어떻게 날짜별로 정렬합니까? (Node.js를) (0) | 2019.12.03 |
[MONGODB] 어떻게 Windows 서비스로 MongoDB의를 실행할 수 있습니까? (0) | 2019.12.03 |