2017-03-13 101 views
1

我试图填充子模式字段。猫鼬 - 填充子模式子数组

A 项目包含多个ProjectFilters。 每个ProjectFilter参考一个FilterValue。 A FilterValue包含在一个(且仅有一个)筛选器中。

ProjectSchema

const ProjectSchema = new Schema({ 
    title: String, 
    filters: [ProjectFilter.schema], 
}, { 
    timestamps: true, 
    toJSON: { 
    virtuals: true, 
    }, 
}); 

ProjectFilterSchema

const ProjectFilterSchema = new Schema({ 
    filterValue: { 
    type: mongoose.Schema.Types.ObjectId, 
    ref: 'FilterValue', 
    }, 
    isMain: { 
    type: Boolean, 
    default: false, 
    }, 
}, { 
    toJSON: { 
    virtuals: true, 
    }, 
}); 

FilterSchema

const FilterSchema = new Schema({ 
    label: String, 
    values: [FilterValue.schema], 
}, { 
    timestamps: true, 
    toJSON: { 
    virtuals: true 
    }, 
}); 

FilterValueSchema

const FilterValueSchema = new Schema({ 
    label: String, 
    color: String, 
}, { 
    toJSON: { 
    virtuals: true, 
    }, 
}); 

该查询不起作用。 filterValue是null

let query = Project.findById(req.params.projectId, { _id: 0, filters: 1 }); 
query.populate('filters.filterValue'); 

我曾尝试使用虚拟填入:

ProjectFilterSchema.virtual('usedValue', { 
    ref: 'Filter', 
    localField: 'filterValue', 
    foreignField: 'values._id', 
    justOne : true, 
}); 

但这返回整个过滤文件,不仅FilterValue需要。

回答

3

为了填充子文档,首先需要明确定义ID引用的文档集合。 这样,猫鼬会知道要查询哪个集合。

(在猫鼬4您可以填写多个层面文档)

//ES6 syntax 
import mongoose from 'mongoose'; 

const Schema = mongoose.Schema; 
const ObjectId = Schema.Types.ObjectId; 

const FilterSchema = new Schema({ 
    label: String, 
    filtervalues: [FilterValueSchema], 
}, { collection: 'filter' }) 

const FilterValueSchema = new Schema({ 
    label: String, 
    color: String, 
}, { collection: 'filtervalue' }) 

const ProjectFilterSchema = new Schema({ 
    filterValue: { 
    type: ObjectId, 
    ref: 'filtervalue', 
}, { collection: 'projectfilter' }) 

mongoose.model('filters', ProjectFilterSchema); 
mongoose.model('projectfilter', ProjectFilterSchema); 
mongoose.model('filtervalue', FilterValueSchema); 

Project.findById(req.params.projectId, { _id: 0 }) 
    .populate('filters.filter.filterValue').