mongoose collection name 소문자 복수

김무연·2024년 8월 14일

mongoDB를 이용하려 ORM 라이브러리인 mongoose를 이용하여, 데이터를 조회하려다 조회가 안되는 오류가 발생하였다. 상황은 아래와 같았다.

예를 들어 test라는 DB에서 user이라는 컬렉션의 document를 조회하려고 하였다. 따라서 우선적으로 db를 연결하고

mongoose.connect("mongodb://localhost:27017/test");

스키마를 대충 지정해준 후 mongoose의 model함수를 이용해 파라미터를 지정해주었다.

let dataSchema = new mongoose.Schema({
  userID: String,
  name: String,
  DataSavedTime: String,
  DataServerID: String,
});
const data = mongoose.model("user", dataSchema);

허나 위처럼 조회하니, 분명 mongoCompass 로 보았을 때는 값이 들어있지만, 빈 배열로 조회가 되었다. 이에 관한 문제를 써칭해보다가 원인을 발견했다.

Mongoose가 기본적으로 모델 이름을 소문자로 변환하고 복수형으로 만들어 해당 컬렉션을 찾기 때문이었다.

구체적으로 설명하자면 Mongoose는 모델 이름을 소문자로 변환하고 복수형으로 바꾸어 컬렉션 이름을 유추하게 된다. 예를 들어, 모델 이름 "user"로 정의하면 Mongoose는 users라는 이름의 컬렉션을 찾으려 한다. 따라서 데이터가 조회되지 않는 문제가 발생한다고 했다.

따라서 이에 대한 해결 방법 으로는 명시적으로 컬렉션 이름을 지정하는 방법이 있다고 한다.

const data = mongoose.model("user", dataSchema, "user");

mongoose 의 model의 파라미터를 살펴보면 아래와 같다

  1. modelName (모델 이름):

모델의 이름을 지정합니다. 이 이름은 애플리케이션 내에서 모델을 참조할 때 사용됩니다.
Mongoose는 이 이름을 소문자로 변환하고 복수형으로 만들어 해당 컬렉션을 찾습니다. 예를 들어, 모델 이름이 "user"일 경우, Mongoose는 users라는 이름의 컬렉션을 찾으려고 합니다. 그러나, 명시적으로 원하는 컬렉션 이름을 지정하면 해당 이름으로 접근할 수 있습니다.

  1. schema (스키마):

데이터의 구조를 정의하는 스키마 객체입니다. 이는 필드의 타입, 기본값, 유효성 검사 등을 정의합니다.

  1. collectionName (컬렉션 이름) (선택적):

이 파라미터를 사용하여 Mongoose가 사용할 MongoDB 컬렉션의 이름을 명시적으로 지정할 수 있습니다.
이 파라미터를 제공하지 않으면, Mongoose는 모델 이름을 소문자로 변환하고 복수형으로 만들어 기본적으로 컬렉션 이름을 유추합니다.

즉 친절한 ai의 설명대로, user를 모델 이름으로 넣을 경우, users 컬렉션을 찾으려 하기 때문에, data가 조회가 안된 것이다.

profile
Notion에 정리된 공부한 글을 옮겨오는 중입니다... (진행중)

0개의 댓글