首页 > 解决方案 > 将 2 个 MongoDB 集合合并为一个 api URL(不合并集合,将它们分开)

问题描述

我对这一切都很陌生,需要一点帮助:

我有两个 Mongodb 集合(我使用猫鼬),ClientsOptions

它们彼此没有联系。

我需要在另一个应用程序的一个页面上访问两组 f 数据。

我可以创建一个指向这些集合的 API 路由:

客户端:https ://example.com/api/clients

选项:https ://example.com/api/options

但是将这两者合并为一个API 路由的最佳方法是什么,例如:

https://example.com/api/clients_options(URL 无关紧要,我只需要两组数据客户端和选项都可以从两者访问。)

这是我的客户模型/架构:

const ClientSchema = new mongoose.Schema({
    client: String,
    brands: [
        {
         type: mongoose.Schema.Types.ObjectId,
         ref: 'Brand'
        }
    ]

});

module.exports = mongoose.model('Client', ClientSchema);

这是我的选项模型/架构:

const OptionsSchema = new mongoose.Schema({
    agencies: Array,
    asset_types: Array,
    format: Array,
});

module.exports = mongoose.model('Options', OptionsSchema);

我在想最好的方法是创建一个模型/模式,以客户模型/模式包装品牌模式的方式包装客户端选项模式。

例如:

const MasterSchema = new mongoose.Schema({
    clients: {
         type: mongoose.Schema.Types.ObjectId,
         ref: 'Clients'
       },
    options: {
         type: mongoose.Schema.Types.ObjectId,
         ref: 'Options'
       }

});

module.exports = mongoose.model('Master', MasterSchema);

但是当我这样做时,我的新主模型/架构似乎没有填充现有的客户端和选项模型/架构,所以我的新主模型/架构保持空白并且没有被创建为集合?

有一个更好的方法吗?

这些是我的路线:

//CLIENT API
    app.get('/api/clients',function(req, res){
        Client.find({})
            .populate({
                path: 'brands',
                populate: {
                    path: 'campaigns',
                    model: 'Campaign'
                } 
            }).exec(function(err, clients){
                if(err) {
                    console.log('ERROR!');
                } else {
                    let data = [];
                    clients.forEach(client => {

                        //console.log(client);
                        data.push(client);
                    });
                    res.send({clients: data});
                }
            });
    });
    //OPTIONS API
    app.get('/api/options',function(req, res){
        Options.find({})
            .exec(function(err, options){
                if(err) {
                    console.log('ERROR!');
                } else {
                    let data = [];
                    options.forEach(option => {

                        //console.log(client);
                        data.push(option);
                    });
                    res.send({options: data});
                }
            });
    });

我想将两者的数据合并到一个 api 中,以便我可以在另一个应用程序中仅调用一个 API URL 来访问所有数据,但无法弄清楚如何/最好的方法?

标签: node.jsmongodbapimongoose

解决方案


我设法弄清楚了,我是通过以下方式做到的:

//ALL DATA API
    app.get('/api/data',function(req, res){
        Client.find({})
            .populate({
                path: 'brands',
                populate: {
                    path: 'campaigns',
                    model: 'Campaign'
                } 
            }).exec(function(err, clients){
                if(err) {
                    console.log('ERROR!');
                } else {
                    let clientData = [];
                    clients.forEach(client => {

                        //console.log(client);
                        clientData.push(client);
                    });

                    Options.find({})
                        .exec(function(err, options){
                            if(err) {
                                console.log('ERROR!');
                            } else {
                                let optionsData = [];
                                options.forEach(option => {

                                    //console.log(client);
                                    optionsData.push(option);
                                });
                                res.send({clients: clientData, options: optionsData});
                            }
                        });
                }
            });
    });

推荐阅读