var CarSchema = new Schema({
name: {type: String},
partIds: [{type: Schema.Types.ObjectId, ref: 'Part'}],
});
var PartSchema = new Schema({
name: {type: String},
props: [
{ colour: {type: String}, shape: {type:String} }
],
});
例如
Car = {
name: "BMW",
partIds:[ObjectId("57baa43e152654f80aac36a6")]}
Part = {
_id: ObjectId("57baa43e152654f80aac36a6"),
name: "Piston",
props: [{colour:"red", shape: "Cubical"},{colour:"green", shape: "cylindrical"}]
因此,当我查询时,我应该得到这样的文档:
Car = {
name: "BMW",
partIds: [{
_id:ObjectId("57baa43e152654f80aac36a6"), name:"Piston", props: [{colour:"red", shape:"cubical"}]
}
props数组应该只有红色的元素
我想用Part Array填充Car,这样它的prop数组只有红色的对象。无论如何要做到这一点,或者我必须采用老式的方式并通过道具阵列循环匹配其颜色与红色。
答案 0 :(得分:1)
您可以通过在populate
电话中提供select
选项来执行此操作:
Car.findOne()
.populate({
path: 'partIds',
select: { props: { $elemMatch: { colour: 'red' } }, name: 1 }
})
.exec(callback);
结果:
{ _id: 57c085451cd8dfcdf814f640,
name: 'BMW',
partIds:
[ { _id: 57baa43e152654f80aac36a6,
name: 'Piston',
props: [ { colour: 'red', shape: 'Cubical' } ] } ] }
select
使用$elemMatch
投影运算符仅选择红色props
元素。
答案 1 :(得分:0)
你可以试试这个,它应该能得到你想要的东西。
car.find({"partIds.props.colour" : "red"})
.populate('partIds')
.exec(function(err,result){...});