MongoDB queryFn 이용법

안녕하세요.

몽고 디비는 테이블 스키마 없이 JSON 데이터를 자유롭게 저장하고 쿼리 가능합니다. 몇가지 심화된 BSON 데이터 타입이 존재하고 aggregation등 활용도 높은 기능 지원합니다.

최근에는 기존 RDBMS에도 JSON 타입을 많이 지원하지만
MongoDB Atlas등 안정적인 서비스가 나오면서 실제 사용자와 서비스 사례가 늘어나고 있습니다.

find: 기존 YML 방식

- type: query
  resource: mongodb
  name: 전체조회
  autoload: false
  query:
    collection: properties
    find:
      name:
        $regex: "{{name}}"

find: queryFn 방식

param.key 그대로 값이 전달됩니다.

- type: query
  resource: mongodb
  autoload: false
  query:
    collection: properties
  queryFn: |
    properties
      .find({
        name: { 
          $regex: name 
        }
      })
      .toArray()
  params:
    - key: name
      label: 업체 이름 검색

find: queryFn으로 복잡한 조건 추가

- type: query
  resource: mongodb
  autoload: false
  query:
    collection: properties
  queryFn: |
    const where = {}

    if (_id) where._id = ObjectId(_id)
    if (name) where.name = { $regex: name }          

    if (paid_at1 && paid_at2) {
      where.paid_at = { 
        $gte: new Date(paid_at1),
        $lte: new Date(paid_at2),
      }
    }

    log('WHERE', where) /* log 찍는 용도 */
    
    properties.find(where).toArray()
  params:
    - key: _id
    - key: name
    - key: paid_at
      format: date
      range: true

로그는 콘솔 로그에 표시됩니다.

aggregate: queryFn으로 추가

queryFn: |
  const where = {}

  properties.aggregate(
    [
      {
        $addFields: {
          last_transaction: {
            $cond: {
              if: {
                $isArray: "$transactions",
              },
              then: {
                $arrayElemAt: ["$transactions", -1],
              },
              else: "$$REMOVE",
            },
          },
        },
      },
      {
        $match: where,
      },
    ]            
  ).toArray()

참고

추출한 결과물은 responseFn, responseRowFn 등으로 직접 수정 가능합니다.

1개의 좋아요