2016-08-25 8 views
1
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} } 
    ], 
}); 

НапримерMongoose: Наполнение вложенного массива объекта с проекцией

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"}] 
    } 

Массив реквизита должен иметь только элемент с цвет красный

Я хочу заполнить автомобиль частичным массивом таким образом, чтобы его опорный массив имел только объект с цветом ур красный. В любом случае, чтобы сделать это, или мне придется идти старомодным способом и петля через массив реквизита, соответствующий его цвету с красным.

+0

У вас уже есть коллекция 'part'? Или вы его создаете и сохраняете свой идентификатор в коллекции 'car'? –

+0

Коллекция деталей различна, и ее идентификаторы хранятся в частях коллекций автомобилей –

+0

, поэтому вы хотите создать документ 'part' и сохранить его идентификатор в коллекции' car', если цвет красный? –

ответ

1

Вы можете сделать это, предоставляя возможность select в вашем populate вызова:

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 элемент.

0

вы можете попробовать это, оно должно получить вас, что вы хотите.

car.find({"partIds.props.colour" : "red"}) 
    .populate('partIds') 
    .exec(function(err,result){...});