Wednesday, 3 May 2017

How to get data from collection in node js using mongoose

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

Here is my Collections structure

list Collection
    _id
    type_id
    detail_id
    address_id
    inquiries_id
    account_id
 Type Collection
    _id
    type
    class
 Detail Collection
    _id
    bedr
    diningr
    livingr
    kitchenr
    bathr
 Address Collection
    _id
    city
    brgy
    street
    bldgno
    floorno
    roomno
 Inquiries Collection
    _id
    views
    inquires"

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

};

when I log the "result" var inside for loop, it has a data but when I try to log the "testresult" var, it is undefined

What will I do get my desire output?



via JerVi

No comments:

Post a Comment