для этого следует использовать mongodb aggregate
в сочетании с операторами $unwind
и $lookup
.
$ unwind Деконструирует поле массива из входных документов для вывода документа для каждого элемента.
$ lookup Выполняет левое внешнее объединение с незащищенной коллекцией в той же базе данных для фильтрации документов из «объединенной» коллекции для обработки.
вот последний запрос:
db.yourCollection.aggregate([
{
$unwind: "$relatedDocsIds"
},
{
$lookup:{
from: "yourCollection",
localField: "relatedDocsIds",
foreignField: "id",
as: "relatedDocs"
}
}
])
В mongoose вы можете сделать это следующим образом:
Model.aggregate([
{
$unwind: "$relatedDocsIds"
},
{
$lookup:{
from: "yourCollection",
localField: "relatedDocsIds",
foreignField: "id",
as: "relatedDocs"
}
}
]).exec((err, docs) => {
if (err) throw err;
console.log(docs);
});
Я бы порекомендовал идти против этого подхода, потому что у mongoose есть метод заполнения, который позволит вам сделать именно это, и их тесты показываютэто быстрее, чем агрегат mongodb.