mongodb - Mongoose:尝试使用 .virtual 方法重命名
问题描述
使用填充时,我必须重命名字段的名称。
const CategorySchema = new Schema(
{
name: {
type: String,
unique: true
},
featured: {
type: Boolean,
default: true
},
image: String,
active: {
type: Boolean,
default: true
},
subCategoryIds: [{ type: Schema.Types.ObjectId, ref: 'SubCategory' }]
},
{
timestamps: true
}
);
export default mongoose.model('Category', CategorySchema);
这是我的类别架构。
这是我的子类别架构
const SubCategory = new Schema(
{
name: {
type: String,
unique: true
},
active: {
type: Boolean,
default: true
},
categoryId: { type: Schema.Types.ObjectId, ref: 'Category' },
productIds: [{ type: Schema.Types.ObjectId, ref: 'Product' }]
},
{
timestamps: true
}
);
SubCategory.virtual('category', {
ref: 'Category',
localField: 'categoryId',
foreignField: '_id'
});
export default mongoose.model('SubCategory', SubCategory);
在这里我有一个归档categoryId
,当使用填充时,我希望它是“类别”,所以我曾经virtual
创建“类别”。并实现了这个
const subCategories = await SubCategory.find({}).populate('category');
但不幸的是它不起作用,它返回正常subCategory
对象并且不存在类别。我错过了什么吗?
解决方案
为什么不使用Mongodb
聚合管道,而不是使用mongoose virtuals
,您可以在填充时使用$lookup
并更改catergoryId
为类别。
尝试这个:
const subCategories = await SubCategory.aggregate([{
$lookup : {
from : "categories",
localField : "categoryId",
foreginField : "_id",
as : "category"
},{
$unwind : "$category"
}])
localField
说要填充哪个字段,from
告诉monogdb从哪个集合填充,foreignField
告诉mongodb哪个字段与它匹配填充,并as
用于存储结果的字段,
$unwind
用于下一阶段,因为$lookup
返回一个数组,我们需要将其转换为类别对象
阅读Mongodb $lookup 文档以获取更多信息。
推荐阅读
- wordpress - 如何将支付方式端点添加到 Woocommerce 中的帐户导航?
- php - Flutter http post请求返回html而不是json
- pandas - 根据来自另一个数据帧的多个条件从一个数据帧计算描述性统计数据
- c# - 通过制表符保存数据
- json - 数据库包含字符串中的引号,需要在 json 中使用,这会导致解析错误
- bazel - 如何确保构建不依赖于两个不同版本的外部依赖?
- arrays - 在C中的循环中覆盖全局char数组与全局char指针
- react-native - 从 React-Native 应用程序在 Facebook 应用程序中分享 URL 作为帖子
- javascript - 在 Typescript 中,`return x` 和 `return await x` 之间有区别吗?
- r - 您可以为函数作为 R 中的随机样本进行论证吗?