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?