Seleccione el elemento de matriz coincidente y devuelva los campos seleccionados
Me gustaría saber cómo configurar la proyección para una matriz coincidente de objetos de una consulta Mongoose.
Por ejemplo, si tengo un modelo Mongoose que se parece a esto:
var User = new Schema({
name: String,
children: [Child]
});
var Child = new Schema({
name: String,
height: Number,
age: Number,
secret: Number
});
En otras palabras, un objeto JSON de ejemplo que podría resultar de este modelo:
User: {
name: 'abc',
children: [
{
name: 'def',
height: 123,
age: 7,
secret: 2
},
{
name: 'ghi',
height: 456,
age: 9,
secret: 3
}
]
}
Como puede ver, el modelo contiene una propiedadchildren
esa es una serie deChild
objetos.
Si solo coincidoUser
que contienen un elemento enchildren
que tiene propiedadname: 'def'
:
Users.find({
children.name: 'def'
})
Luego puedo configurar la proyección para seleccionar propiedades (comoname
) y también propiedades del objeto coincidente utilizando un operador posicional ($
):
.select({
name: 1,
children.$: 1
}
El problema ahora es que con esta proyección,children.$
siempre devolverá la totalidadChild
objeto, incluidas las propiedades que no quiero consultar, comosecret
.
{
name: 'abc',
children: [
{
name: 'def',
height: 123,
age: 7,
secret: 2
}
]
}
Idealmente, me gustaría poder seleccionar también ciertas propiedades delchild
objeto obtenido a través de$
similar a cómoname
fue seleccionado del objeto padreUser
, pero no puedo encontrar una manera de hacer esto.
Una forma de seleccionar una sola propiedad es usar el formatochildren.$.age
pero esto solo se puede usar para seleccionar 1 propiedad, ya que al hacerlo varias veces se produce un error, ya que no se puede usar la opción$
operador varias veces.
.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
})
¿Es posible seleccionar la proyección para un objeto obtenido por el operador posicional en Mongoose?