title: "Join" two collection in MongoDB using node js
body: <p>I'm trying to make a query between two collections in mongodb using node js.</p>
  
  <p>I have these two collection in the db:</p>
  
  <p><strong>Trip</strong></p>
  
  <pre><code>{               
      "_id":ObjectId("55a922531e35772c1b17d4a0"),
      "name":"trip_name",
      "waypoints":[
          "4c828999d8086dcb03877752",
          "4dd2ae657d8b4c6585f1a6fd",
          "4c59c3e4f346c928a8634dca"
      ],
      "line_points":[
          [
              42.850937,
              13.569256
          ],
          [
              42.85109,
              13.569377
          ],
          [
              42.851131,
              13.569225
          ]
      ],
      "time":"00:10:23",
      "distance":6.622,
      "hashKey":"object:8207"
  };
  </code></pre>
  
  <p><strong>Poi</strong> </p>
  
  <pre><code>{  
        "_id":"4c828999d8086dcb03877752",
        "type":"Feature",
        "geometry":{  
           "type":"Point",
           "coordinates":[  
              13.575249910354614,
              42.85484995890166
           ]
        },
        "properties":{  
           "title":"Lorenz Cafè",
           "id":"4c828999d8086dcb03877752",
           "poi-type":1,
           "category":"ristorazione",
           "subCategory":"Café",
           "categoryIds":"4bf58dd8d48988d16d941735",
           "marker-color":"#FF7519",
           "marker-size":"small",
           "marker-symbol":"restaurant",
           "indirizzo":"Piazza del Popolo, 5",
           "citta":"Ascoli Piceno",
           "regione":"Marche"
        }
  </code></pre>
  
  <p>Through the route, I do I query according to the id that step and I would like that the query I would restore a json like this:</p>
  
  <p><strong>Result i want</strong></p>
  
  <pre><code>{"_id":"55a922531e35772c1b17d4a0","name":"trip_name","waypoints":[{"4c828999d8086dcb03877752":{"title":"Lorenz Cafè","id":"4c828999d8086dcb03877752","category":"ristorazione","position":{"lat":42.85484995890166,"lng":13.575249910354614}}},{"4dd2ae657d8b4c6585f1a6fd":{"title":"Ottica Di Ferdinando","id":"4dd2ae657d8b4c6585f1a6fd","category":"negozi","position":{"lat":42.85485741498569,"lng":13.57675423240643}}},{"4c59c3e4f346c928a8634dca":{"title":"Leopoldus Ristorante","id":"4c59c3e4f346c928a8634dca","category":"ristorazione","position":{"lat":42.85648980743132,"lng":13.575512766838072}}}],"line_points":[[42.850937,13.569256],[42.85109,13.569377],[42.851131,13.569225]],"time":"00:10:23","distance":6.622}
  </code></pre>
  
  <p>I implemented this <strong>route</strong> :</p>
  
  <pre><code>/*
  TRIP BY ID
   */
  var j=0;
  router.get('/:id', function(req, res) {
      db = req.db;
      var idString=req.params.id;
      var objId = new ObjectID(idString);
      var collection2=db.get('poilist');
      var collection = db.get('trip');
  
      collection.find({"_id": objId},{},function(e,docs){
          var trip=docs[0];
          var poi=[];
          var wp=trip.waypoints;
  
          for(var i=0; i&lt; wp.length; i++)
          {
              collection2.find({"properties.id": wp[i]},function(e,docs2){
                  poi[j]={
                          "title" : docs2[0].properties.title,
                          "id": docs2[0].properties.id,
                          "category": docs2[0].properties.category,
                          "position": {"lat":docs2[0].geometry.coordinates[1], "lng":docs2[0].geometry.coordinates[0]}
                      };
                      var id = wp[j];
                      wp[j]= {};
                      wp[j][id]=poi[j];
                      if(j==wp.length-1){
                          console.log('emit '+j);
                          emitter.emit('attesa' + j);
                      }else{
                          j++;
                      }
  
              });
          }
          emitter.once('attesa'+ (trip.waypoints.length-1) ,function() {
              j=0;
              console.log('once');
  
              res.json(trip);
          });
      });
  });
  </code></pre>
  
  <p>This route works but if you were to make multiple calls simultaneously, no longer work.</p>
  
  <p>I have an idea: count the number of requests and go to double check if the id of the place is in this trip but it seems very expensive.
  I would like to know a more practical method for making queries with multiple collections in mongo.
  Thanks in advance</p>