【问题标题】:Express Js + Mongoose + JoinsExpress Js + Mongoose + Joins
【发布时间】:2021-08-09 02:16:38
【问题描述】:

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

尺码集合

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
     },{
       _id: object I'd
       sizeid: 456,
       size: M -----;> from size collection
       Price: 150
      }]
   }]

【问题讨论】:

  • .populate() ?
  • 是的,我已经使用填充并在下面的答案中发布了解决方法。

标签: express mongoose mongoose-populate


【解决方案1】:

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

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

那么当你需要做大小的时候

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

【讨论】:

    【解决方案2】:

    我已添加为虚拟字段。我是 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;
    });
    

    【讨论】:

      猜你喜欢
      • 2016-06-25
      • 2019-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-01
      • 2021-12-20
      • 2020-07-01
      • 2021-04-27
      相关资源
      最近更新 更多