preencher matriz aninhada de referência aninhada

A estrutura do projeto é

estrutura

O arquivo principal é index.js, localizado no diretório principal. Este tem

'use strict'

var mongoose = require('mongoose');
var app = require('./app');

var port = process.env.port || 3000;

mongoose.connect('mongodb://localhost:27017/changeProducts',(err,res) =>{
    if(err){
        throw err;
    }else{
        console.log("Base de datos funcionando correctamente..");

        app.listen(port, function(){
            console.log('Servidor nodejs corriendo(app.listen)... ');
        });

    }
});

A versão do mangusto é 5.0

O app.js é

'use strict'

var express = require('express');
var bodyParser = require('body-parser');

var app = express();

//carga de rutas
//cr
var roleRoutes = require('./routes/cr/role');
var userRoutes = require('./routes/cr/user');
var loginRoutes = require('./routes/cr/login');
//category
var categoryRoutes = require('./routes/cr/category');

//publication
var publicationRoutes = require('./routes/publication/publication');
var offerRoutes = require('./routes/publication/offer');



app.use(bodyParser.urlencoded({
    extended: false
}));

app.use(bodyParser.json());

//configurar cabeceras
app.use((req, res, next)=>{
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Headers', 'X-API-KEY, Origin, X-Requested-With','Content-Type, Accept, Access-Control-Request-Method');
    res.header('Access-Control-Allow-Method', 'GET, POST, OPTIONS, PUT, DELETE');
    res.header('Allow', 'GET, POST, OPTIONS, PUT, DELETE');

    next();
});


//rutas base
//cr
app.use('/api', roleRoutes);
app.use('/api', userRoutes);
app.use('/api', loginRoutes);
app.use('/api', categoryRoutes);

//publication
app.use('/api', publicationRoutes);
app.use('/api', offerRoutes);


module.exports = app;

as rotas como userRoutes estão nas rotas da pasta.

a primeira rota é routes / cr / category.js

'use strict'

var express = require('express');
var CategoryController = require('../../controllers/cr/category');
var api = express.Router();
var middlewareSecurity = require('../../security/middleware');

api.get('/categories', CategoryController.getCategories );

module.exports = api;

o outro é rotas / cr / user.js

'use strict'

var express = require('express');
var UserController = require('../../controllers/cr/user');
var api = express.Router();
var middlewareSecurity = require('../../security/middleware');

//api.get('/users/',middlewareSecurity.HasRole("admin,user"), UserController.getUsers );

//actions of user
api.get('/users/', UserController.getUsers);
api.get('/user/:id', UserController.getUser);
api.post('/user', UserController.saveUser);
api.put('/user/:id', UserController.updateUser);
api.delete('/user/:id', UserController.deleteUser);

module.exports = api;

Os esquemas estão em modelos / cr

o primeiro esquema localizado em 'models / category.js' é

'use strict'

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var CategorySchema = Schema({
    name: String,
    subcategories: [{
        name: String
    }]
});

module.exports = mongoose.model('Category',CategorySchema);

O outro esquema é UserSchema e parece com isso

 'use strict'

    var mongoose = require('mongoose');
    var Schema = mongoose.Schema;


    var UserSchema = Schema({
        firstName: {
            type: String,
            required: true
        },
        secondName: String,
        lastName: {
            type: String,
            required: true
        },
        email: {
            type: String,
            unique: true,
            required: true
        },
        password: {
            type: String,
            required: true
        },
        status: {
            type: String,
            required: true
        },
        roles: [{
            type: Schema.ObjectId,
            ref: 'Role'
        }],

        publications: [{
            title: {
                type: String,

            },
            description: String,
            status: {
                type: String,

            },
            createdAt: {
                type: Date
            },
            updatedAt: {
                type: Date,
                default: Date.now()
            },

            pictures: [{
                name: String
            }],

            categories: [{
                type: Schema.Types.ObjectId,
                refPath: 'Category'
            }],

            publicationOffers: [{
                idpublication: [{
                    type: Schema.ObjectId,
                    ref: 'User.publications'
                }],
                iduser: {
                    type: Schema.ObjectId,
                    ref: 'User'
                },
                createdAt: {
                    type: Date
                }
            }]
        }]
    });


    module.exports = mongoose.model('User', UserSchema);

Eu tenho um plugin chamado mongooseedermongooseeder

Para começar, corro no terminal

sementes de nó.

isso cria alguns dados de categoria.

depois que eu corro

npm start (lembre-se de instalar dependências com o npm install)

o arquivo controllers / cr / user.js possui

'use strict'

var User = require('../../models/cr/user');
var bcrypt = require('bcrypt');
var path = require('path');
var fs = require('fs');

e uma das funções é

   function getUsers(req, res) {

        var find = User.find({}).sort('-firstName');

        find.exec((err, users) => {
            if (err) {
                res.status(500).send({
                    message: "Error en la peticion"
                });
                return;
            }

            if (!users) {
                res.status(404).send({
                    message: "no hay users"
                });
                return;
            }

            User.populate(users, {
                path: 'publications.categories'
            }, (err, users) => {

                if (err) {
                    res.status(500).send({
                        message: "Error en la peticion"
                    });
                    return;
                }

                if (!users) {
                    res.status(404).send({
                        message: "User no encontrado"
                    });
                    return;
                }


                res.status(200).send({
                    users
                });


                // var options = {
                //     path: 'publications.categories',
                //     select: 'subcategories.name'
                // };

                // if (err) {
                //     res.status(200).send({
                //         users
                //     });
                // }
                // User.populate(users, options, function (err, users) {
                //     res.status(200).send({
                //         users
                //     });
                // });

            });
        });
    }

module.exports = {
    getUser,
    getUsers,
    saveUser,
    updateUser,
    deleteUser
}

esse método é usado por routes / cr / user.js que contém (veja a descrição de onde está a rota e o que contém) api.get ('/ users /', UserController.getUsers);

A ligaçãohttp: // localhost: 3000 / api / users mostre isso

{
    "users": [
        {
            "roles": [
                "5ae4a8b0a7510e3bd80917d5"
            ],
            "publications": [],
            "_id": "5ae79ee4b34bea810861ccc5",
            "firstName": "santiago4",
            "lastName": "torres3",
            "email": "[email protected]",
            "status": "activo",
            "password": "$2bO outro esquema é UserSchema e parece com issorONv8dlZVOMJ4kU1x4XUmuVeTiyl.B.IVrIIlPDHz.0Yuqh5w05wK",
            "__v": 0
        },
        {
            "roles": [],
            "publications": [
                {
                    "updatedAt": "2018-04-30T03:23:11.921Z",
                    "categories": [
                        "5ae4a8b0a7510e3bd80917db",
                        "5ae4a8b0a7510e3bd80917da"
                    ],
                    "pictures": [],
                    "publicationOffers": [],
                    "_id": "5ae68cbf7cda345ec0b910f3",
                    "title": "publicacio2",
                    "description": "descripcion2",
                    "status": "activo",
                    "createdAt": "2018-04-30T03:25:51.053Z"
                },
                {
                    "updatedAt": "2018-04-30T03:45:14.159Z",
                    "categories": [
                        "5ae4a8b0a7510e3bd80917db"
                    ],
                    "pictures": [],
                    "publicationOffers": [],
                    "_id": "5ae692183670e54b9c529698",
                    "title": "publicacio2",
                    "description": "descripcion2",
                    "status": "activo",
                    "createdAt": "2018-04-30T03:48:40.654Z"
                },
                {
                    "updatedAt": "2018-04-30T04:01:23.131Z",
                    "categories": [
                        "5ae4a8b0a7510e3bd80917db"
                    ],
                    "pictures": [],
                    "publicationOffers": [],
                    "_id": "5ae6956d9e15516ccceb13d8",
                    "title": "publicacio2",
                    "description": "descripcion2",
                    "status": "activo",
                    "createdAt": "2018-04-30T04:02:53.177Z"
                }
            ],
            "_id": "5ae689f9a67a6284f4af4033",
            "firstName": "santiago3",
            "lastName": "torres3",
            "email": "[email protected]",
            "status": "activo",
            "password": "$2bO outro esquema é UserSchema e parece com issoge1lS.r/eV1nJRkQDi4dn.0AQKpJfI.a5GzBlpsN5trHefVRVjVCS",
            "__v": 0
        },
        {
            "roles": [],
            "publications": [],
            "_id": "5ae689f0a67a6284f4af4032",
            "firstName": "santiago2",
            "lastName": "torres2",
            "email": "[email protected]",
            "status": "activo",
            "password": "$2bO outro esquema é UserSchema e parece com issoHND7lixmr5RT4A/Kz5gv6.it9kmHpauytIHw/UydgTOAwkbNTJf8O",
            "__v": 0
        },
        {
            "roles": [],
            "publications": [],
            "_id": "5ae689e5a67a6284f4af4031",
            "firstName": "santiago1",
            "lastName": "torres1",
            "email": "[email protected]",
            "status": "activo",
            "password": "$2bO outro esquema é UserSchema e parece com isso.sNgBlSerC6f19Hd2.xnzOtpUAd8BB9JXXM5BlGIvr0dUhWOtn5IS",
            "__v": 0
        }
    ]
}

o arquivo controllers / cr / category.js possui

'use strict'

var Categories = require('../../models/cr/category');


function getCategories(req, res){

    Categories.find({},(err, categories) =>{
        if(err){
            res.status(500).send({ message: 'Error en la peticion' });
            return;   
        }

        if(!categories){
            res.status(404).send({ message: 'No hay categories' });
            return
        }

        res.status(200).send({ categories });
    });
}


module.exports = {
    getCategories
}

esse método é usado por routes / cr / category.js que ele contém (veja a descrição de onde está a rota e o que ela contém)

'use strict'

var express = require('express');
var CategoryController = require('../../controllers/cr/category');
var api = express.Router();
var middlewareSecurity = require('../../security/middleware');

api.get('/categories', CategoryController.getCategories );

module.exports = api;

http: // localhost: 3000 / api / categories vai mostrar esse json

{
    "categories": [
        {
            "subcategories": [
                {
                    "_id": "5ae4a8b0a7510e3bd80917db",
                    "name": "Decoracion"
                },
                {
                    "_id": "5ae4a8b0a7510e3bd80917da",
                    "name": "Electrodomésticos"
                },
                {
                    "_id": "5ae4a8b0a7510e3bd80917d9",
                    "name": "Cocina"
                },
                {
                    "_id": "5ae4a8b0a7510e3bd80917d8",
                    "name": "Muebles"
                }
            ],
            "_id": "5ae4a8b0a7510e3bd80917d7",
            "name": "Hogar",
            "__v": 0
        },
        {
            "subcategories": [
                {
                    "_id": "5ae4a8b0a7510e3bd80917e0",
                    "name": "Computador escritorio"
                },
                {
                    "_id": "5ae4a8b0a7510e3bd80917df",
                    "name": "Laptop"
                },
                {
                    "_id": "5ae4a8b0a7510e3bd80917de",
                    "name": "Celulares"
                },
                {
                    "_id": "5ae4a8b0a7510e3bd80917dd",
                    "name": "Tablets"
                }
            ],
            "_id": "5ae4a8b0a7510e3bd80917dc",
            "name": "Tecnología",
            "__v": 0
        }
    ]
}

Preciso preencher categorias de subcategorias de referência de UserSchema de CategorySchema (consulte os esquemas mencionados anteriormente). Se você vir no arquivo controllers / cr / user.js, há

User.populate(users, {
            path: 'publications.categories'
        }, (err, users) => {....

atualmente o UserSchema contém este

categories: [{
                type: Schema.Types.ObjectId,
                refPath: 'Category'
            }],

Eu estou tentando fazer algo assim

 categories: [{
                type: Schema.Types.ObjectId,
                refPath: 'Category.subcategories'
            }],

categorias está dentro das publicações (consulte os esquemas mencionados anteriormente)

Eu preciso conseguir algo assim

"publications": [
                {
                    ...
                    "categories": [
                        {
                          "_id": "5ae4a8b0a7510e3bd80917db",
                          "name": "subcategory1"
                        },
                        {
                           "_id": "5ae4a8b0a7510e3bd80917da",
                           "name": "subcategory2"
                        }
                    ]

                },
                {
                    ....
                    "categories": [
                        {
                           "_id": "5ae4a8b0a7510e3bd80917e0",
                           "name": "subcategory1"
                        }
                    ]                
                },
    ]

mas está me mostrando isso nas publicações do UserSchema

"publications": [
            {
                ...
                "categories": [
                    "5ae4a8b0a7510e3bd80917db",
                    "5ae4a8b0a7510e3bd80917da"
                ]

            },
            {
                ...
                "categories": [
                    "5ae4a8b0a7510e3bd80917e0"
                ]                
            },
]

publicações é parte do UserSchema (consulte UserSchema mencionado anteriormente)

este é o link para baixar o repositório onde está o projetolink de reporsitório

Por favor me ajude com isso. Eu tenho procurado e tentado muitas coisas sem sucesso. Não consigo encontrar uma solução na documentação, no stackoverflow e em outros sites. Nada funciona. Tentei usar referências dinâmicas de mangusto e isso não funciona. Eu tentei usar isso.https://github.com/buunguyen/mongoose-deep-populate

E eu tentei muita coisa e nenhuma delas funciona. Por favor me ajude!. Eu estou preocupado com isso.

questionAnswers(0)

yourAnswerToTheQuestion