Wednesday, 3 May 2017

How to get data from different collection in node js using mongoose

I have 6 Different Collections in my mongodb, the 5 collections are to connected to one connection, But I didn't used ref, instead I made is that I get the Id of 5 collections and then saved it to the 6th collection namely "List" so that I still have common field that I can use as a reference

Here is my Collections structure

list Collection
   var ListDoc = new mongoose.Schema({
       type_id        : {type: String, required: true},
       detail_id      : {type: String, required: true},
       address_id     : {type: String, required: true},
       inquiries_id   : {type: String, required: true},
       account_id     : {type: String, required: true}
    });
    module.exports = mongoose.model('List', ListDoc);

Account Collection
    var accountDoc = new mongoose.Schema({
        email     : {type: String, unique: true, required: true},
        password  : {type: String, required: true}
    });
    module.exports = mongoose.model('Accounts', accountDoc );

Type Collection
    var TypeDoc = new mongoose.Schema({
        property_type   : {type: String, required: true},
        property_class  : {type: String, required: true},
        property_u_f    : {type: String, required: true},
    });
    module.exports = mongoose.model('Type', TypeDoc);

Detail Collection
    var DetailDoc = new mongoose.Schema({
        property_name           : {type: String, required: true},
        property_price          : {type: Number, required: true},
        property_condition      : {type: String, required: true},
        property_area           : {type: Number, required: true}
    });
    module.exports = mongoose.model('Detail', DetailDoc);

Address Collection
    var AddressDoc = new mongoose.Schema({
        street      : {type: String, required: true},
        bldg_name   : {type: String, required: true},
        unit_no     : {type: String, required: true},
        ipcode      : {type: Number, required: true},
        district    : {type: String, required: true},
    });
    module.exports = mongoose.model('Address', AddressDoc);

 Inquiries Collection
    var InquiriesDoc = new mongoose.Schema({
        inquiries    : {type: Number, required: true},
        views        : {type: Number, required: true},
    });
    module.exports = mongoose.model('Inquiries', InquiriesDoc);

Note: each collection has different .js file

The list Collection will have the Ids of 4 another Collection.

This is what Im trying to achieve

[ {
   "_id": "5907747e424c860f7495ad46",
   "account_id": "5908f3381cd9810ea8e2b517",
   "type": {
       "type" : "apartment",
       "class" : "middle"
      },
   "detail": {
       "bedr": 4,
       "diningr": 2,
       "livingr": 1,
       "kitchenr": 1,
       "bathr": 4
    },
   "address": {
       "city" : "lucena",
       "brgy" : "8",
       "street" : "rose",
       "bldgno" : "24",
       "floorno": "2",
       "roomno": "205"  
     },
  "inquiries": {
       "views" : 0,
       "inquires" : 0
      }
  },
  {
   "_id": "5907747e424c860f7495ad47",
   "account_id": "5908f3381cd9810ea8e2b517",
   "type_id": {
       "type" : "apartment",
       "class" : "middle"
             },
   "detail": {
       "bedr": 4,
       "diningr": 2,
       "livingr": 1,
       "kitchenr": 1,
       "bathr": 4
    },
   "address": {
       "city" : "lucena",
       "brgy" : "8",
       "street" : "rose",
       "bldgno" : "24",
       "floorno": "3",
       "roomno": "307"  
     },
   "inquiries": {
       "views" : 0,
       "inquires" : 0
       }
   }, ]

First I get all the data inside the list collection which is the Ids of 4 Collection and then I tried to loop it so that I can get the another data from other collections

for(var loop =0 ; loop < list.length; loop++){
        var pt_id = list[loop].type_id;
        var pa_id = list[loop].address_id;
        var pd_id = list[loop].detail_id;
        var pi_id = list[loop].inquiries_id;
 }

I'd use async inside for loop then concate it into "testresult" var using +=

here is my code

var PL = require('../models/list');
var PT = require('../models/type');
var PA = require('../models/address');
var PD = require('../models/detail');
var PI = require('../models/inquiry');
var cryption    = require('../services/encrypt_decrypt');
var crypt = new cryption();
var async = require('async');


module.exports.read = function (request, response) {
var decryptedId = crypt.decrypt(request.decode.id);


    var propertylistquery = PL.find({}).where('account_id').equals(decryptedId).select({"_id":0,"__v":0});

    propertylistquery.exec(function (error, list) {
        if (error) {
            return response.status(500).send({success: false, error: error, message: 'Something went wrong.'});
        }
        if (!list) {
            return response.status(200).send({success: false, message: 'User not found in the database.'});
        }

        var testresult;
        for(var loop =0 ; loop < list.length; loop++){
            var pt_id = list[loop].type_id;
            var pa_id = list[loop].address_id;
            var pd_id = list[loop].detail_id;
            var pi_id = list[loop].inquiries_id;

            //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
            // Getting the property type
            //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
            var ptquery = PT.find({}).where('_id').equals(pt_id).select({"__v":0});

            //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
            // Getting the property address
            //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
            var paquery = PA.find({}).where('_id').equals(pa_id).select({"__v":0});

            //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
            // Getting the property detail
            //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
            var pdquery = PD.find({}).where('_id').equals(pd_id).select({"__v":0});

            //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
            // Getting the propertyinquiry
            //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
            var piquery = PI.find({}).where('_id').equals(pi_id).select({"__v":0});

            var resources = {
                Type        :   ptquery.exec.bind(ptquery),
                Address     :   paquery.exec.bind(paquery),
                Detail      :   pdquery.exec.bind(pdquery),
                Inquiry     :   piquery.exec.bind(piquery)
            };

            //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
            // Asynchrozing the queries
            //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
            async.parallel(resources, function (error, results){
                if (error) {
                    response.status(500).send(error);
                    return;
                }

                testresult += results;
                //console.log(results);
            });
        }


        console.log(testresult);
        response.json({success: true, data: list, message: 'Successfully fetched all property.'});
    });

    };



via JerVi

No comments:

Post a Comment