将2个MongoDB集合合并到一个api URL中(不合并集合,将它们分开)

时间:2019-05-10 15:23:42

标签: node.js mongodb api mongoose

这是我的新手,需要一点帮助:

我有两个Mongodb集合(我使用猫鼬),客户选项

它们没有相互链接。

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

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

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

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

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

https://example.com/api/clients_options(与网址无关,我只需要两组数据“客户端和选项”即可从两者访问)。

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

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

我一直认为最好的方法是创建一个 master 模型/架构,该模型/架构将 Clients Options 架构包装在一起, 客户端模型/架构包装品牌架构的方式。

例如:

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

但是,当我这样做时,新的Masters Model / Schema似乎没有填充现有的Client and Option Model / Schemas,因此我的新 Master Model / Schema保持空白,而没有不能创建为收藏?

有更好的方法吗?

以下是我的每条路线:

//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来访问所有数据,但无法弄清楚如何/最好的方法?

1 个答案:

答案 0 :(得分:0)

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

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