问题描述
我有两个系列。大小和项目。尺寸在项目中引用,我需要在查询项目时添加尺寸标题
尺码合集
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;
});