EDIT
minimal reproduction repo
It's easier to explain in code than English. The following code works, but it feels like there's gotta be an easier, more MongoDBy/mongoosy way ...
// recipeModel.js, relevant part of the schema
equipments: [{
_id: {
type: Schema.Types.ObjectId,
ref: 'equipments',
},
quantity: {
type: Number,
required: true,
},
}],
// recipeController.js
const equipmentsWorkaround = recipe => Object.assign({}, recipe.toObject(), {
equipments: recipe.toObject().equipments.map(equip => ({
quantity: equip.quantity,
name: equip._id.name,
_id: equip._id._id,
})),
})
const getItem = (req, res, next) => {
Recipes.findById(req.params.id)
.populate('equipments._id')
.then(equipmentsWorkaround) // <--- ugh ...
.then(recipe => res.json(recipe))
.catch(next)
}
I know how to do a "conventional" ref
in mongoose, but is what I'm after here even possible in mongo?
desired outcome:
equipments: [
{
quantity: 1,
name: "Pan",
_id: 'some mongo object here...'
},
{
quantity: 3,
name: "Big Knife",
_id: 'some mongo object here...'
}
]
.populate('equipments._id')
expected to do ? Can you explain a little bit more here ? Why cant you use embedded doc here ? – Dayflowerequipments
array looks like – Marjanaequipments
to embeddedequipments: [{ _id: Schema.Types.ObjectId, name:String, quantity: { type: Number, required: true, }, }]
. Now mongoose should be able to map it when you fetch the recipes. Populate is not applicable here. – Dayflowerequipments
is a standalone model, with it's ownCRUD
methods. – Devilkin