MongoDB를 이용해서 개발 중, 한참 동안 삽질한 내용을 남깁니다.
MongoDB에서 Document를 save 한 후 반환 받은 id를 가지고 바로 findById를 실행 할 때에는 문제가 없는데, Queue에 데이터를 넣어서 실행할 경우 findById가 항상 null을 반환하는 문제
분명 정상적인 id로 Query를 날리는데, null을 return 하는 경우였습니다.
이상한 것은 findById
findOne({ _id: id })
은 모두 null을 return 하는데, find()
로 모든 document를 검색하면 정상적으로 저장되어 있는 것이 확인되었습니다. 그리고 심지어 findOne({ otherField: value })
처럼 id가 아닌 다른 필드 값으로는 정상적으로 검색이 됐습니다.
Schema 정의 시 _id를 별도로 지정하지 않았거나 별도로 지정할 때 ObjectId로 지정한 것이 문제였습니다. id를 ObjectId 형태로 캐스팅하거나 Schema 정의 시 애초에 String으로 정의를 한다면 문제 없이 동작하게 됩니다. save 한 후 반환 받은 id를 바로 이용할 경우에는 ObjectId 형태이기 때문에 정상적으로 동작한 것이었고, Queue에 넘기며 String으로 변환되었기 때문에 ObjectId로 정의 된 _id를 검색할 수 없었던 것이었습니다.
@Prop({ type: String, default: () => new ObjectId() })
_id: string;
엉뚱하게 동시성 문제, 비동기 처리, 기타 등등의 이유라고 생각하여 구글해 해봤지만 해답을 찾을 수 없었습니다.
그러다 그냥 단순하게 생각하고 mongoose findById return null
을 검색하고, 첫번째 게시물에서 해답을 찾고 허무해졌습니다. ㅎㅎㅎ