본문 바로가기

mongoDB

[Mongoose] virtual field만들어서 populate 사용하기 with options

반응형

모델 스키마에 virtual 필드를 생성 

const MenuCategorySchema: Schema<IMenuCategory> = new Schema<IMenuCategory>(
  {
    // MySql 메뉴 카테고리 IDX
    idx: { type: Number, required: true, unique: true },
    // MySql 매장 IDX
    restaurantIdx: { type: Number },
    // 카테고리 명
    name: { type: String, required: true },
    // 노출 우선순위
    priority: { type: Number, required: true },
    // 삭제 여부
    isDeleted: { type: Boolean, required: true, default: false },
    // 카테고리 설명
    description: { type: String, default: '' },
    // Document 생성 일시
    createdAt: { type: Schema.Types.Date },
    // Document 수정 일시
    updatedAt: { type: Schema.Types.Date },
  },
  {
    timestamps: true,
    skipVersioning: true,
    versionKey: false,
    read: 'primary',
  },
);

MenuCategorySchema.virtual('menu', {
  ref: 'menu',
  localField: 'idx',
  foreignField: 'menuCategoryIdx',
});
MenuCategorySchema.set('toObject', { virtuals: true });
MenuCategorySchema.set('toJSON', { virtuals: true });

ref : 참고할 collection 

localField : 현재 스키마 (collection)에서 연결할 필드

foreignField : 참고할 collection 중 localField와 연결할 필드 

menuCategory의 Idx 필드 값은 menu collection의 필드 menuCategoryIdx와 값이 같다.

 

**  이래에 두 줄 toObject, toJSON 반드시 해줘야함. virtual 모델은 output값이 따로 없대! 

 

 

 

 

mongoose 

const getSortedCategoryListAndMenusByRestaurantIdx = async (
  restaurantIdx: number,
): Promise<IMenuCategory[]> => {
  return MenuCategoryModel.find(
    {
      restaurantIdx,
      isDeleted: false,
    },
    ['idx', 'name', 'priority'],
  )
    .sort([['priority', 'ASC']])
    .populate({
      path: 'menu',
      select: 'name dailySalesQuantity isSoldOut priority',
      match: {
        isDeleted: false,
        status: true,
        $or: [
          { useReservationOrder: true },
          { useWaitingOrder: true },
          { useTakeOutOrder: true },
          { useOnSiteOrder: true },
        ],
      },
      options: {
        sort: { priority: 1 },
      },
    })
    .exec();
};

 

 

 

반응형