Este enunciado ha sido evaluado por especialistas para que tengas la seguridad de la exactitud de este artículo.
Solución:
No puede hacer esto en una sola consulta porque MongoDB no admite uniones. En su lugar, tienes que dividirlo en un par de pasos:
// Get the _ids of people with the last name of Robertson.
Person.find(lastname: 'Robertson', _id: 1, function(err, docs)
// Map the docs into an array of just the _ids
var ids = docs.map(function(doc) return doc._id; );
// Get the companies whose founders are in that set.
Company.find(founder: $in: ids, function(err, docs)
// docs contains your answer
);
);
Llegué bastante tarde a esta: p Pero solo estaba buscando una respuesta similar y pensé en compartir lo que se me ocurrió en caso de que alguien encuentre esto por la misma razón.
No pude encontrar una manera de lograr esto a través de consultas de mongoose, pero creo que funciona usando la canalización de agregación de MongoDB
Para obtener la consulta que está buscando, podría hacer algo como esto:
const result=await Company.aggregate([
$lookup:
from: 'persons',
localField: 'founder',
foreignField: '_id',
as: 'founder'
,
$unwind: path: '$founder',
$match: 'founder.lastname': 'Robertson'
]);
$lookup
actúa como .populate()
, reemplazando la referencia con los datos reales. Devuelve un array aunque ya que se puede utilizar para hacer coincidir varios documentos.
$unwind
elimina elementos de un arrayy en este caso simplemente convertirá el único elemento array en un campo.
$match
luego hace lo que parece y solo devuelve documentos que coinciden con la consulta. También puede hacer coincidencias más complejas que la igualdad estricta si lo necesita.
En general, la forma en que funciona la canalización de agregación consiste en filtrar/modificar continuamente los documentos coincidentes en cada paso del camino hasta que tenga exactamente lo que desea.
No he comprobado el rendimiento de esto, pero definitivamente prefiero que Mongo haga el trabajo en lugar de filtrar los resultados innecesarios del lado del servidor.
Supongo que el único inconveniente es que el resultado será solo un array de objetos en lugar de modelos de mangosta, ya que la canalización suele cambiar la forma de los documentos. Por lo tanto, no podrá utilizar los métodos del modelo en los datos devueltos.
Si conservas alguna desconfianza y disposición de aumentar nuestro escrito puedes ejecutar una aclaración y con mucho gusto lo interpretaremos.