Arun Tyagi
Arun Tyagi

Reputation: 2256

Populate on basis of condition in mongoose, mongoDB

Here is my code to get one floorplan and populate all flats linked with this

see the code below :

var floorplan = Floorplan.find({ 
    project: req.params.project, 
    tower: req.params.tower, 
    isDeleted: false 
});
floorplan.populate('flats').exec(function(err, floorplan) {
    if (err) { return res.send(err); }
    if (!floorplan) { return res.status(401).json(); }
    res.status(200).json(floorplan);
});

But I want to populate only those flats where isDeleted : false How to achive this ??

Schema of floorplan

var FloorplanSchema = new Schema({
    project: { type: Schema.ObjectId, ref: "Project" },
    flats: [{ type: Schema.ObjectId, ref: "Flat" }],
    tower: [{ type: Schema.ObjectId, ref: "Tower" }],
    unitType: String,
    area: Number,
    floorPlan2D: String,
    floorPlan3D: String,
    livingRoomArea: Number,
    kitchenArea: Number,
    balconies: Number,
    bathRooms: Number,
    isDeleted: { type: Boolean, 'default': false },
    createdAt: { type: Date, 'default': Date.now }
});

Schema of flat

var FlatSchema = new Schema({
    tower: { type: Schema.ObjectId, ref: "Tower" },
    floorplan: { type: Schema.ObjectId, ref: "Floorplan" },
    project: { type: Schema.ObjectId, ref: "Project" },
    status: String,
    floor: Number,
    size: String,

    superbuiltup_area: Number,

    directionFacing: String,
    furnishingState: String,
    flooringType: String,
    createdAt: { type: Date, 'default': Date.now },
    isDeleted: { type: Boolean, 'default': false },

});

Upvotes: 25

Views: 32345

Answers (1)

chridam
chridam

Reputation: 103365

The populate() method has an option which allows for filtering, you can either try this

Floorplan
.find({ 
    project: req.params.project, 
    tower: req.params.tower, 
    isDeleted: false 
})
.populate({
    path: 'flats',
    match: { isDeleted: false }
})
.exec(function(err, floorplan) {
    if (err) { return res.send(err); }
    if (!floorplan) { return res.status(401).json(); }
    res.status(200).json(floorplan);
});

or

Floorplan
.find({ 
    project: req.params.project, 
    tower: req.params.tower, 
    isDeleted: false 
})
.populate('flats', null, { isDeleted: false })
.exec(function(err, floorplan) {
    if (err) { return res.send(err); }
    if (!floorplan) { return res.status(401).json(); }
    res.status(200).json(floorplan);
});

Upvotes: 46

Related Questions