Ran
Ran

Reputation: 11

Node.JS, Express & MongoDB Atlas:: Multiple Collections ejs

I have tried almost all the solutions but couldn't get this fixed.

I'm trying to get multiple collection of data (Mongodb Atlas) onto one ejs file. But I can't get data onto the rendered ejs sheet. But when I tested with locus I can see all the data received from the database up to res.render("/vendor/show"). But it is not passing onto ejs template.

I have three sets of data sitting on the mongo Atlas:

const vendorSchema = new mongoose.Schema({
    name:String,
    image:String,
    imageId:String,
});

const newpromoSchema = new mongoose.Schema({
    name:String,
    image:String,
    imageId:String,
    vendor:String,
    description:String,
    sdate:String,
    edate:String,
});
const neweventSchema = new mongoose.Schema({
    name:String,
    image:String,
    imageId:String,
    description:String,
    vendor:String,
    sdate:String,
    edate:String,
});

    router.get("/vendors/:id",function(req,res) {
        var events={}; //Create Empty event Object
        var promotions={}; //Create Empty promotion Object
        var vendors={};//Create Empty vendor Objext
        Promotion.find({},function (err,allPromotions) {

            if (err) {
                console.log(err);
            } else {
                //Find Collection And Assign It To Object
                promotions=allPromotions;             
            }
        });

        Event.find({},function(err, allEvents) {
            if (err) {
                console.log(err);
            } else {      
                events=allEvents;   
            }
        });
        Vendor.find({},function(err,allVendors){
            if(err){
                console.log(err);
            }else{
                vendors=allVendors;
                //find order collection and passing it to ejs templates
                res.render("vendors/show",{ event:events, promotion:promotions vendor:vendors});
            }
        });
    });

Show.ejs code as 
<%=vendor.name%> 
<%=promotion.name%> 
<%=event.name%>

Upvotes: 1

Views: 698

Answers (2)

Ran
Ran

Reputation: 11

I managed to get all data using the below function. But now I have another issue, need to filter all the Promotions and Events by vendor But it doesn't filter.

Data Schema

 const neweventSchema = new mongoose.Schema({
        name:String,
        image:String,
        imageId:String,
        description:String,
        vendor:String,
        sdate:String,
        edate:String,
    });

    const Event = mongoose.model("Event",neweventSchema);

    module.exports = Event;



    //SCHEMA SETUP===============================================================================================================
    const newpromoSchema = new mongoose.Schema({
        name:String,
        image:String,
        imageId:String,
        vendor:String,
        description:String,
        sdate:String,
        edate:String,
    });
    //compile into a model
    const Promotion = mongoose.model('Promotion',newpromoSchema);

    module.exports = Promotion;

  //SCHEMA SETUP===============================================================================================================   
    const vendorSchema = new mongoose.Schema({
        name:String,
        image:String,
        imageId:String,
    });

    const Vendor = mongoose.model("Vendor", vendorSchema);

    module.exports = Vendor;

Routes as below

router.get("/vendors/:id", function (req, res) {

  Vendor.find({}, function (err, allVendors) {
    if (err) {
        console.log(err);
    } else {
      // //Find Collection And Assign It To Object

      Event.find({}, function (err, allEvents) {
        if (err) {
          console.log(err);
        } else {

          Promotion.find({}, function (err, allPromotions) {
            if (err) {
                console.log(err);
            } else {

              //find order collection and passing it to ejs templates
              res.render("vendors/show", {event: allEvents, promo: allPromotions, vendor: allVendors});

            }
          });
        }
      });
    }
  });
});

EJS Show page But It doesn't get filtered.

    <!-- Trying to filter all the events by vendor if event's vendor name == vendor name then show on the show page -->
<%if(event.vendor === vendor.name){%>
<div class = "container-fluid">
    <div class = "row">
        <%event.forEach(function(events){%>
            <div class="col-sm-6 col col-md-4 col-lg-3">
                <div class="thumbnail">
                    <img src ="</%=events.image%>" class="rounded" width="304" height="236">
                    <div class="caption">
                        <h4><%=events.name%></h4>
                        <p class="font-italic font-weight-bold text-muted">
                            <%=events.vendor%>
                        </p>
                        <p><strong>Start Date</strong><%=events.sdate%></p>
                        <p><strong>End Date</strong><%=events.edate%></p>
                    </div>
                    <p>Event Details <br>
                        <%=events.description.substring(0,100)%>
                    </p>
                    <p>             
                        <a href="events/</%=events._id%>", class="btn btn-outline-primary btn-sm">Find More </a>
                    </p>
                </div>  
            </div>
        <%})%>
    </div>
</div>
<%}%> 
<!-- //Trying to filter all the promotions by vendor if vendor name= to promotions's vendor name only show in the show page-->
<%if(promo.vendor===vendor.name){%>
<div class = "container-fluid">
    <div class = "row">
        <%promo.forEach(function(promotions){%>
            <div class="col-sm-6 col col-md-4 col-lg-3">
                <div class="thumbnail">
                    <img src ="<%=promotions.image%>" class="rounded" width="304" height="236">
                    <div class="caption">
                        <h4><%=promotions.name%></h4>
                        <p class="font-italic font-weight-bold text-muted"> <%=promotions.vendor%></p>
                        <p><strong>Start Date</strong> <%=promotions.sdate%></p>
                        <p><strong>End Date</strong> <%=promotions.edate%></p>
                    </div>          
                    <p>
                        <%=promotions.description.substring(0,100)%> 
                    </p>
                    <p>             
                        <a href="/promotions/<%=promotions._id %>", class="btn btn-outline-primary btn-sm">Find More </a>
                    </p>
                </div>  
            </div>
        <%})%>
    </div>
</div>
<%}%>

Upvotes: 0

Ketan
Ketan

Reputation: 64

You need to handle the async process. In your current code, there are three async processes. Please go through following the link you will definitely get an idea about it.

https://blog.risingstack.com/mastering-async-await-in-nodejs/

if you need more help Don’t hesitate to comment.

Upvotes: 1

Related Questions