2015-07-17 2 views
2

Я пытаюсь сделать запрос между двумя коллекциями в mongodb с помощью узла js.«Join» две коллекции в MongoDB с помощью узла js

У меня есть эти две коллекций в БДЕ:

поездки

{    
    "_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" 
}; 

Пои

{ 
     "_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" 
     } 

Через маршрут, я я запрос в соответствии с идентификатором, который шаг, и я бы хотел, чтобы запрос я бы восстановил json вот так:

Результат я хочу

{"_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} 

Я реализовал этот маршрут:

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

Этот маршрут работает, но если вы должны были сделать несколько вызовов одновременно, больше не работают.

У меня есть идея: посчитайте количество запросов и дважды проверьте, находится ли идентификатор места в этой поездке, но это кажется очень дорогим. Я хотел бы узнать более практичный метод для создания запросов с несколькими коллекциями в монго. Заранее спасибо

+0

Просто получите базовые –

ответ

6

сначала рекомендую использовать мангуст. Прежде всего вы должны подготовить свои модели, например:

var mongoose = require('mongoose') 
    , Schema = mongoose.Schema 

var personSchema = Schema({ 
    _id  : Number, 
    name : String, 
    age  : Number, 
    stories : [{ type: Schema.Types.ObjectId, ref: 'Story' }] 
}); 

var storySchema = Schema({ 
    _creator : { type: Number, ref: 'Person' }, 
    title : String, 
    fans  : [{ type: Number, ref: 'Person' }] 
}); 

var Story = mongoose.model('Story', storySchema); 
var Person = mongoose.model('Person', personSchema); 

и после этого, когда вы хотите «присоединиться» вы больше всего использовать следующий метод:

Story.find().populate("fans"); 

Для Moar http://mongoosejs.com/docs/populate.html

+2

Извините, так как я не очень хорошо знаю мангуст, каковы его преимущества перед библиотекой, которую я использовал? – sigLosco

+0

Mongoose позволяет вам предоставить вашей базе данных структуру (схему) и запустить более сложные запросы. посмотрите http://mongoosejs.com/docs/guide.html для получения дополнительной справки – Jalasem

+0

Можем ли мы фильтровать 'Story.find(). populate (" fans ");' на основе 'person.name' как в sql' select * из JOIN b на aa = bb, где b. some like "% filtertext%" ' – NikhilGoud

1

Просто получить основные данные JSON по первому требованию

{ "_id": ObjectId ("55a922531e35772c1b17d4a0"), "Имя": "trip_name", "путевые точки": [ "4c828999d8086dcb03877752", "4dd2ae657d8b4c6585f1a6fd", "4c59c3e4f346c928a8634dca" ] }

Затем вызовите другой API, который получает данные путевых точек с использованием асинхр звонит и обещает, и как только обещания разрешаются, объедините их.

+0

Я не понимаю, что вы говорите, извините – sigLosco

Смежные вопросы