I would like to know how to set the projection for a matched array of objects from a Mongoose query.
For example, if I have a Mongoose model that looks something like this:
var User = new Schema({
name: String,
children: [Child]
});
var Child = new Schema({
name: String,
height: Number,
age: Number,
secret: Number
});
In other words, an example JSON object that might result from this model:
User: {
name: 'abc',
children: [
{
name: 'def',
height: 123,
age: 7,
secret: 2
},
{
name: 'ghi',
height: 456,
age: 9,
secret: 3
}
]
}
As you can see the model contains a property children
that is an array of Child
objects.
If I match only User
that contain an item in children
that has property name: 'def'
:
Users.find({
children.name: 'def'
})
I can then set the projection to select properties (such as name
) and also properties from the matched object using a positional operator ($
):
.select({
name: 1,
children.$: 1
}
The problem now is that with this projection, children.$
will always return the entire Child
object, including properties I may not want to query, such as secret
.
{
name: 'abc',
children: [
{
name: 'def',
height: 123,
age: 7,
secret: 2
}
]
}
Ideally I would like to be able to also select certain properties from the child
object obtained through $
similar to how name
was selected from the parent object User
, but I cannot find a way to do this.
One way to select a single property is to use the format children.$.age
but this can only be used to select 1 property, as doing it multiple times results in an error as you cannot use the poisitional $
operator multiple times.
.select({
name: 1,
// and now select the height and age
// but only of the child that matches name = 'def'
// WITHOUT returning the entire object (exclude name and secret)
children.$.age,
children.$.height // error
})
Is selecting the projection for an object obtained by the positional operator possible in Mongoose?