Заполнить вложенный массив в мангусте
Как я могу заполнить "компоненты" в Примере документа:
{
"__v": 1,
"_id": "5252875356f64d6d28000001",
"pages": [
{
"__v": 1,
"_id": "5252875a56f64d6d28000002",
"page": {
"components": [
"525287a01877a68528000001"
]
}
}
],
"author": "Book Author",
"title": "Book Title"
}
Это мой JS, где я получаю документ от Мангуста:
Project.findById(id).populate('pages').exec(function(err, project) {
res.json(project);
});
7 ответов:
Мангуст 4.5 поддерживает это
Project.find(query) .populate({ path: 'pages', populate: { path: 'components', model: 'Component' } }) .exec(function(err, docs) {});
это работает для меня:
Project.find(query) .lean() .populate({ path: 'pages' }) .exec(function(err, docs) { var options = { path: 'pages.components', model: 'Component' }; if (err) return res.json(500); Project.populate(docs, options, function (err, projects) { res.json(projects); }); });
документы: модель.заполнения
Как уже отмечалось,
Mongoose 4
поддерживает это. Очень важно отметить, что вы также можете рекурсировать глубже одного уровня, если это необходимо,хотя это не отмечено в документах:Project.findOne({name: req.query.name}) .populate({ path: 'threads', populate: { path: 'messages', model: 'Message', populate: { path: 'user', model: 'User' } } })
Я нашел это очень полезным, создавая feathersjs перед крючком, чтобы заполнить глубокое отношение уровня 2 ref. Модели мангустов просто имеют
tables = new Schema({ .. tableTypesB: { type: Schema.Types.ObjectId, ref: 'tableTypesB' }, .. } tableTypesB = new Schema({ .. tableType: { type: Schema.Types.ObjectId, ref: 'tableTypes' }, .. }
затем в feathersjs перед крючком:
module.exports = function(options = {}) { return function populateTables(hook) { hook.params.query.$populate = { path: 'tableTypesB', populate: { path: 'tableType' } } return Promise.resolve(hook) } }
Так Просто по сравнению с некоторыми другими методами я пытался добиться этого.
вы можете заполнить несколько вложенных документов, как это.
Project.find(query) .populate({ path: 'pages', populate: [{ path: 'components', model: 'Component' },{ path: 'AnotherRef', model: 'AnotherRef', select: 'firstname lastname' }] }) .exec(function(err, docs) {});
Вы можете сделать это с помощью
$lookup
агрегация такжеProject.aggregate([ { "$match": { "_id": mongoose.Types.ObjectId(id) } }, { "$lookup": { "from": Pages.collection.name, "let": { "pages": "$pages" }, "pipeline": [ { "$match": { "$expr": { "$in": [ "$_id", "$$pages" ] } } }, { "$lookup": { "from": Component.collection.name, "let": { "components": "$components" }, "pipeline": [ { "$match": { "$expr": { "$in": [ "$_id", "$$components" ] } } }, ], "as": "components" }}, ], "as": "pages" }} ])