型号一:
import { Schema, model } from 'mongoose';
const vendorSchema = new Schema<VendorProps>({
company_name: String,
product_type: String,
}, {
timestamps: true,
toJSON: { virtuals: true },
toObject: { virtuals: true },
});
vendorSchema.virtual('campaigns', {
ref: 'campaign',
foreignField: 'vendor_id',
localField: '_id'
});
const Vendor = model<VendorProps>(
'Vendor',
vendorSchema
);
export default Vendor;
型号二:
import { Schema, model } from 'mongoose';
const campaignSchema = new Schema<CampaignProps>({
lead_volume: Number,
cost_per_credit_score: String,
vendor_id: {
type: Schema.ObjectId,
ref: 'Vendor',
},
}, {
timestamps: true,
toJSON: { virtuals: true },
toObject: { virtuals: true },
});
const Campaign = model<CampaignProps>(
'campaign',
campaignSchema
);
export default Campaign;
(我省略了 Props,因为它们是 .ts 文件)在
index
文件中,我导入引用以下控制器方法的路由:
import VendorModel from '../models/vendor';
await VendorModel.findById(id).populate('campaigns').exec();
我至少有 12 个其他类似的模型,它们的工作方式完全相同。 (当我创建这两个 + 控制器时,我只是逐字复制/粘贴并修改名称)
但由于某种原因,当我通过 ID 查询供应商类型时,它给出了标题错误。我完全被难住了。 (我在这里查看了一些其他类似的线程,但没有一个可以帮助我,因为我认为我的代码实际上没有任何问题,它应该可以工作)
有什么想法吗?
Campaign
模型在任何地方都没有
used
(除了填充查询中)。创建后,我将模型添加到现有路线(作为查询),代码起作用了。所以基本上模型不是“
registered
”,所以模型一引用了一个不存在的模型(如果你问猫鼬,我们就是)。tl:博士;您必须在代码中引用模型才能使虚拟字段发挥作用。
之前:
import basketModel from "../models/Basket";
import database from "..";
const getOrderBasket = async (id: string) => {
const basket = await basketModel
.findOne({ _id: id })
.populate(["products"])
.lean();
console.log(JSON.stringify(basket, null, 2));
};
(async () => {
try {
database;
await getOrderBasket("...");
} catch (error) {
console.error(error);
} finally {
database.close();
}
})();
之后:
import basketModel from "../models/Basket";
import Product from "../models/Product"; // import models
import database from "..";
const getOrderBasket = async (id: string) => {
Product; // here
const basket = await basketModel
.findOne({ _id: id })
.populate(["products"])
.lean();
console.log(JSON.stringify(basket, null, 2));
};
(async () => {
try {
database;
await getOrderBasket("...");
} catch (error) {
console.error(error);
} finally {
database.close();
}
})();