728x90
검색의 기본, 여러 데이터 중에 특정 대상만 불러오는것
기본이자 가장 어려운 파트라고도 할 수 있다.
특히, 보기좋은 코드가 개발자를 기분좋게하는데 검색쿼리를 짜다보면 자칫 코드가 길어질수있다.
여러가지 조건들이 붙기 때문이다.
그와중이 addFields를 남발하여 길어져버린 나의 코드가 눈에띄었다.
어디에 주로 addFields를 썼나 보니,
$lookup을 통해 다른 collection과 join한뒤 특정 document만 불러오고자 할때 리스트를 벗겨내는 과정에서 남용했다.
{
$lookup: {
from: 'users',
localField: 'userId',
foreginField: '_id',
as: 'user'
}
}
// 결과 => [{ _id: ObjectId('...'), name: '...', ... }]
// 원하는 데이터는 => { _id: ObjectId('...'), name: '...', ... }
// 따라서, 사용했던 코드
{
$lookup: {
from: 'users',
localField: 'userId',
foreginField: '_id',
as: 'user'
}
},
{
$addFields: {
user: {
$arrayElemAt: ['$user', 0]
}
}
}
// 결과 => { _id: ObjectId('...'), name: '...', ... }
원하는 document만 불러오기 위해 코드가 무려 7줄이나 길어지는 문제가 발생했다.
$addFields는 이런식으로 쓰라고 있는 기능도 아닐것으로 생각이 든다.
$addFields는 저장된 데이터는 아니지만 클라이언트에 필요한 데이터, 예를들어 sum, count 등의 데이터들을 추가하기 위해 존재할것이다.
그렇다면, 무엇이 적절할까. 정답은 이미 나와있다.
{
$lookup: {
from: 'users',
localField: 'userId',
foreignField: '_id',
as: 'user'
}
},
{
$project: {
...,
user: { $arrayElemAt: ['$user', 0] }
}
}
7줄의 코드가 아닌 단 한줄의 코드면 충분하다.
728x90
반응형
'개발, 코딩 > RDB|SQL|NoSQL' 카테고리의 다른 글
mac m1, mongodb 설치하기 (0) | 2022.07.31 |
---|---|
mongo 이슈 해결 (서버 용량 초과로 인한 DB다운 후 복구) (0) | 2022.06.19 |
mongo - $pull (0) | 2021.01.06 |
Mongo/Nodejs, connect to remote DB (0) | 2020.09.17 |
mongodb, how to check empty array field ? (0) | 2020.06.18 |