programing

Mongoose 인덱스를 만들지 않음

subpage 2023. 6. 23. 22:08
반응형

Mongoose 인덱스를 만들지 않음

MongoDB 인덱스를 작성하려고 합니다.Mongoose ODM을 사용하고 아래 스키마 정의에서 사용자 이름 필드를 고유 인덱스로 설정했습니다.컬렉션과 문서가 모두 제대로 생성됩니다. 인덱스만 작동하지 않습니다.모든 문서에는 다음과 같은 내용이 있습니다.시작할 때 인덱스 명령을 실행하여 인덱스를 만들어야 하지만 생성 중인 인덱스는 없습니다.그게 중요하다면 호스팅을 위해 MongoLab을 사용하고 있습니다.저는 또한 컬렉션을 반복적으로 삭제했습니다.뭐가 문제야.

var schemaUser = new mongoose.Schema({
    username: {type: String, index: { unique: true }, required: true},
    hash: String,
    created: {type: Date, default: Date.now}
}, { collection:'Users' });

var User = mongoose.model('Users', schemaUser);
var newUser = new Users({username:'wintzer'})
newUser.save(function(err) {
    if (err) console.log(err);
});

을 .'index'할 때 :

User.on('index', function(err) {
    if (err) {
        console.error('User index error: %s', err);
    } else {
        console.info('User indexing complete');
    }
});

또한 다음을 호출하여 Mongoose의 디버그 로깅을 활성화합니다.

mongoose.set('debug', true);

디그로다같표다니됩시가 됩니다.ensureIndex당신이 인덱스를 만들기 위해 만들고 있다고 부릅니다.

저의 경우 다음을 명시적으로 지정해야 했습니다.

const User = new mongoose.Schema({
    name: String,
    email: String,
    password: String
 },
 {autoIndex: true}
)

Mongoose는 "인덱스가 이미 DB에 존재하는 경우, 인덱스는 대체되지 않습니다"(credit)라고 선언합니다.

를 들어, 한 적이 입니다.{unique: true}하지만 당신은 그것을 바꾸고 싶어합니다.{unique: true, sparse: true}그러면 유감스럽게도 Mongoose는 해당 필드에 대한 인덱스가 DB에 이미 존재하기 때문에 이 작업을 수행하지 않습니다.

이러한 경우 기존 인덱스를 삭제한 후 mongoose에서 새 인덱스를 만들 수 있습니다.

$ mongo
> use MyDB
> db.myCollection.dropIndexes();
> exit
$ restart node app

작업량이 많으므로 생산 시스템에 주의하십시오!


다른 상황에서 제 인덱스가 생성되지 않아 JohnnyHK가 추천하는 오류 보고 기법을 사용했습니다.제가 그렇게 했을 때, 저는 다음과 같은 대답을 받았습니다.

E11000 duplicate key error collection

이것은 나의 새로운 인덱스가 제약 조건을 추가하고 있었기 때문입니다.unique: true그러나 컬렉션에 고유하지 않은 기존 문서가 있으므로 Mongo는 인덱스를 만들 수 없습니다.

이 경우 색인을 다시 작성하기 전에 중복 필드가 있는 문서를 수정하거나 제거해야 합니다.

작동하지 않는 모델에서 인덱스 이벤트를 연결했을 때 콘솔에서 "'retryWrites' 필드가 인덱스 사양에 적합하지 않습니다."라는 오류가 발생했습니다.내 앱에서 'retryWrites'를 참조한 유일한 위치는 내 연결 문자열 끝에 있었습니다.나는 이것을 제거하고 앱을 다시 시작했고 인덱스 재구축에 성공했습니다.retryWrites를 다시 제자리에 놓고 앱을 다시 시작했더니 오류가 사라졌습니다.내 사용자 컬렉션(문제를 일으켰던)이 비어 있어서 포스트맨을 사용하여 새 레코드를 만들 때 (몽고 나침반 커뮤니티와 함께) 새 레코드가 생성되고 인덱스가 표시되는 것을 보았습니다.RetryWrites가 무엇을 하는지는 모르겠지만, 오늘이 제가 처음으로 사용한 날이었습니다. 하지만 그것이 제 문제의 근원인 것 같았습니다.

아, 그리고 내가 왜 그걸 사용했을까요?Mongo의 Atlas Cloud 사이트에서 가져온 연결 문자열에 고정되었습니다.중요해 보였어요.음.

당신의 문제를 해결하는 것일 수도 있습니다.

var schema = mongoose.Schema({
speed: Number,
watchDate: Number,
meterReading: Number,
status: Number,
openTrack: Boolean,
 });
schema.index({ openTrack: 1 });

mongoose 설명서 https://mongoosejs.com/docs/guide.html#indexes, 에서 볼 수 있듯이 인덱스를 만들려면 schema.index를 정의해야 합니다.테스트하려면 아래 코드를 확인하십시오.

  • 스키마를 업데이트한 후 확인할 서버를 다시 시작합니다.
const schemaUser = new mongoose.Schema(
  {
    username: {
      type: String,
      required: true,
      index: true,
      unique: true,
      dropDups: true,
    },
    hash: String,
    created: {
      type: Date,
      default: Date.now,
    },
  },
  {
    autoCreate: true, // auto create collection
    autoIndex: true, // auto create indexes
  }
)
// define indexes to be create
schemaUser.index({ username: 1 })

const User = mongoose.model('Users', schemaUser)
const newUser = new Users({ username: 'wintzer' })
newUser.save(function (err) {
  if (err) console.log(err)
})

"readPreference"를 "secondary" 또는 "secondaryPreferred"로 설정한 연결은 autoCreate, autoIndex 등의 연결 옵션을 선택하지 않을 수 있습니다.

mongoose 연결에서 readPreference 옵션을 선택합니다.

데이터 가져오기 명령줄 유틸리티를 작성할 때 이 문제가 발생했습니다.실행 종료 후 일부 인덱스는 생성되었지만 일부 인덱스는 생성되지 않았습니다.

해결책은 전화하는 것이었습니다.await model.ensureIndexes()스크립트를 종료하기 전에 실행합니다.에 상관없이 효과가 있었습니다.autoIndex옵션 값.

◦mongoose 연결 옵션이 다음을 지정하지 않는지 확인합니다.

autoIndex: false

언급URL : https://stackoverflow.com/questions/12452865/mongoose-not-creating-indexes

반응형