[MongoDB/Javascript] 몽구스 반환객체 to Javascript Object
몽구스 이놈은 쿼리문 반환을 자바스크립트 객체로 안해주고 , 지만 알고있는 형태 (Mongoose Document)로 반환해줌.
그래서 이 반환 값을 그대로 받아서 깊은 복사 해서 보면 겁나 이상한 형태로 들어있음. 아ㅏㅏㅏㅏ진짜 ㅈ아ㅉ자증ㄴ나ㅏ
몽구스 공식 문서에 따르면
몽구스 쿼리의 반환객체인 이 "Mongoose Document" 는 내부 상태가 많기때문에 Javascript Objec 보다 훨씬 무겁다!
쿼리 성능 향상을 위해서 lean() 부터 이용하라!
고 가이드 하고있음
예를 들면
const schema =new mongoose.Schema({ name: String });
const MyModel = mongoose.model('Test', schema);
await MyModel.create({ name: 'test' });
// Module that estimates the size of an object
// in memoryconst sizeof = require('object-sizeof');
const normalDoc =await MyModel.findOne();
// To enable the `lean` option for a query,
// use the `lean()` function.const leanDoc =await MyModel.findOne().lean();
sizeof(normalDoc);// approximately 600
sizeof(leanDoc);// 36, more than 10x smaller!
이런 식으로!
내가 원했던 기능은
회원리스트의 No.를 역순으로 표시 해주는 것이었다.
예를 들어 회원수가 총 100명이면 앞에 No.를 100, 99, 98, 97, 96 ...이런 식으로.
특정 조건으로 검색했을 때 나오는 회원 수를 그대로 적용될 수 있게 해야했다.
전체 회원이 100명인데 "9/20일 이후 가입자"를 조건으로 검색하니 30명이 나왔다면 , No.는 30, 29, 28, ...이 되어야 한다.
따라서 디비에서 값을 조회할때 가져올 수 있는게 아니라 ,
값을 모두 가져온 후에 -> 데이터를 조작해서 row의 갯수를 구해야 했다.
몽고디비에서 조건 검색 후 데이터를 가져왔고 , 그 데이터에 map을 돌렸더니..
이렇게 아주 그지같이 나왔다 !!!!
' $__ ' 는 뭐고
' $isNew ' 는 또 뭐며,
왜 데이터가 _doc 안에 들어있는건지;;;
해결은 간단하게
기존 코드에 .lean() 만 더해줬다 !
그러니 내가 원하는대로 자바스크립트 객체 형태로 반환값을 받을 수 있었고 , 여기에 map을 돌려서
row_num 키를 추가해줄 수 있었다.
데이터 가공은
>>>>
const cleanUserData = adminUserRecord.map((v,k)=>{
return {
...v,
row_num : totalUserRecord-(size*(page-1))-k,
}
});
**
검색된 데이터 전체 길이 - (화면에 한번에 표시해줄 리스트 갯수 x (화면에 보이는 현재 페이지 -1) - 해당 데이터의 키값 )
**
이렇게 계산해줬다 !
그랬더니 정상적으로 인덱스를 역순으로 추가할 수 있었다~ 뿌듯 ^ㅡ^*
암튼 몽구스 멈춰~ 나 힘들게 하지마~
다른 블로그 글 보면 .lean() 을 하고 나면
- Change tracking
- Casting and validation
- Getters and setters
- Virtuals
- save()
과 같은 기능들을 쓸 수 없기때문에 주의하라고 나와있다. ( 나는 지금 이 기능들을 사용하진 않기 때문에 부담 없이 쓸 수 있었다. )
** 참고
https://node-js.tistory.com/26
[MongoDB]mongoose에서 가상 필드 조회안하기, Document를 Object로 변환하기
mongoose에서 가상 필드를 사용하지 않고 조회하는 방법을 공유하려고 합니다. 더 좋은 방법이 있다면 댓글로 알려주시면 감사하겠습니다.🙏 가상 필드 조회 안 하기 아래처럼 가상 필드를 사용
node-js.tistory.com