Express Js + Mongoose + Joins

问题描述

我有两个系列。大小和项目。尺寸在项目中引用,我需要在查询项目时添加尺寸标题

尺码合集

size:[{
_id: 123
title: S
},{
_id: 456
title:M
}]

物品收集

items:[{
title: item1,sizes:[{
     _id: object I'd
     sizeid: 123
     Price: 100
     },{
       _id: object I'd
       sizeid: 456,Price: 150
      }]
   }]

如何执行连接以获得以下输出

items:[{
title: item1,sizes:[{
     _id: object I'd
     sizeid: 123
     size: S ----> from size collection
     Price: 100
     },size: M -----;> from size collection
       Price: 150
      }]
   }]

解决方法

您需要将 Items Schema 的属性 size 设计为一个 ObjectID 数组,该数组将引用 Sizes Schema。

const ItemSchema = new Schema(
  {
    ...
    sizes: [{ type: Schema.Types.ObjectId,ref: 'Sizes' }]
  }
);

然后当你需要获得尺寸时

const result = await Items.findOne(_id: itemId).populate('sizes');
,

我已添加为虚拟字段。我是 MERN 堆栈的初学者。

itemSchema.virtual("sizemaster",{
  ref: "size",localField: "sizes.sizeId",foreignField: "_id",});

itemSchema.virtual("itemsize").get(function (this: any) {
  const sizemaster = this.sizemaster;
  const itemsize = this.sizes.map(
    (s: {
      _id: any;
      sizeId: any;
      purchaseprice: any;
      mrp: any;
      salesprice: any;
      availablequantity: any;
    }) => {
      const sizeIndex = sizemaster.findIndex(
        (sm: { _id: { equals: (arg0: any) => any } }) => sm._id.equals(s.sizeId)
      );
      if (sizeIndex !== -1) {
        let itemsize = {
          itemsizeId: s._id,sizeId: s.sizeId,sizeTitle: sizemaster[sizeIndex].title,mrp: s.mrp,salesprice: s.salesprice,availablequantity: s.availablequantity,};

        return itemsize;
      }
    }
  );
  return itemsize;
});