node node.js mongodb mongoose

node.js - node - matrix html javascript



Poblar matriz anidada en mangosta (7)

¿Cómo puedo completar "componentes" en el documento de ejemplo?

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

Este es mi JS donde recibo el documento de Mongoose:

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


Como otros han notado, Mongoose 4 apoya esto. Es muy importante tener en cuenta que también puede recurse más allá de un nivel, si es necesario, aunque no se menciona en los documentos:

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


Eliminar referencia de documentos

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

Esto funcionó para mí.

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


Encontré esto muy útil creando un feathersjs before hook para poblar una relación profunda de dos niveles de ref. Los modelos de mangosta simplemente tienen

tables = new Schema({ .. tableTypesB: { type: Schema.Types.ObjectId, ref: ''tableTypesB'' }, .. } tableTypesB = new Schema({ .. tableType: { type: Schema.Types.ObjectId, ref: ''tableTypes'' }, .. }

luego en feathersjs before hook:

module.exports = function(options = {}) { return function populateTables(hook) { hook.params.query.$populate = { path: ''tableTypesB'', populate: { path: ''tableType'' } } return Promise.resolve(hook) } }

Tan simple en comparación con algunos otros métodos que estaba tratando de lograr esto.


Funciona para mi:

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

Documentación: Model.populate


Mongoose 4.5 admite esto

Project.find(query) .populate({ path: ''pages'', populate: { path: ''components'', model: ''Component'' } }) .exec(function(err, docs) {});


Puede llenar múltiples documentos anidados como este.

Project.find(query) .populate({ path: ''pages'', populate: [{ path: ''components'', model: ''Component'' },{ path: ''AnotherRef'', model: ''AnotherRef'', select: ''firstname lastname'' }] }) .exec(function(err, docs) {});


Usted puede hacer esto usando la agregación $lookup también

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