Заполнение вложенного массива в мангусте

Как я могу заполнить «компоненты» в примере документа:

{ "__v": 1, "_id": "5252875356f64d6d28000001", "pages": [ { "__v": 1, "_id": "5252875a56f64d6d28000002", "page": { "components": [ "525287a01877a68528000001" ] } } ], "author": "Book Author", "title": "Book Title" } 

Это мой JS, где я получаю документ от Mongoose:

  Project.findById(id).populate('pages').exec(function(err, project) { res.json(project); }); 

Mongoose 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); }); }); 

Документация: Model.populate

Как отмечали другие, Mongoose 4 поддерживает это. Очень важно отметить, что при необходимости вы можете занять более глубокий уровень, чем один уровень, хотя в документах он не указан:

 Project.findOne({name: req.query.name}) .populate({ path: 'threads', populate: { path: 'messages' , model: 'Message' , populate: { path: 'user' , model: 'User' } } }) 

Я нашел, что это очень полезно, создавая feathersjs перед захватом, чтобы заполнить соотношение 2 ref level deep. Модели мангуста просто имеют

 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 aggregation, а также

 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" }} ]) 

Удалить ссылку документа

 if (err) { return res.json(500); } Project.populate(docs, options, function (err, projects) { res.json(projects); }); 

Это сработало для меня.

 if (err) { return res.json(500); } Project.populate(options, function (err, projects) { res.json(projects); }); 
  • Как создать streamи в nodejs
  • Является ли NodeJS действительно однопоточным?
  • NPM не устанавливает какие-либо модули: сетевой разъем зависает
  • Как обрабатывать исключения в глобальном масштабе с помощью собственных обещаний в node.js?
  • Express.js req.ip возвращает :: ffff: 127.0.0.1
  • Как вы издеваетесь над MySQL (без ORM) в Node.js?
  • Структура папки для проекта Node.js
  • Что делает тело-парсер с выражением?
  • Как сохранить настройки / файлы конфигурации Node.js?
  • Разница между app.use и app.get в express.js
  • Найдите версию установленного пакета npm
  • Interesting Posts
    Давайте будем гением компьютера.