2017-05-03 1 views
1

J'ai 2 pour 2 schémas définis collections différentes, et je dois remplir un d'entre eux dans les autres:Populate de deux collections

stationmodel.js

var stationSchema = new Schema({ 
    StationName: 'string', 
    _id: 'number', 
    Tripcount: [{ type: Schema.Types.ObjectId, ref: 'Tripcount'}] 
}, 
    {collection: 'stations'} 
); 
module.exports = mongoose.model('Station', stationSchema); 

tripmodel.js

var tripSchema = new Schema({ 
    _id: { type: Number, ref: 'Station'}, 
    Tripcount: 'number' 
}, 
    {collection: 'trips'} 
); 
module.exports = mongoose.model('Tripcount', tripSchema); 

Selon le peuplement de mangoustes documentation, c'est la voie à suivre. J'ai le problème que "Tripcount" reste comme [] quand j'utilise Postman pour obtenir les stations.

Ma DB Structure pour la collection 'stations':

{ 
    "_id": 1, 
    "StationName": "Station A", 
} 

Et pour la collection 'voyages':

{ 
    "_id": 1, 
    "Tripcount": 6 
} 

Mes routes.js:

module.exports = function(app) { 

    app.get('/stations', function(req,res) { 
     var query = Station.find().populate('Tripcount'); 
     query.exec(function(err, stations){ 
      if(err) 
       res.send(err); 
      res.json(stations); 
     }); 
    }); 

}; 

je peux ne semble pas trouver l'erreur, peut-être que quelqu'un ici peut repérer une erreur que j'ai faite.

Répondre

1

Vous joignez la mangouste SchemaTypes entre guillemets simples, vous devez soit faire référence à l'SchemaTypes directement lorsque vous définissez une propriété dans vos documents qui seront jetés à son associé SchemaType.

Par exemple, lorsque vous définissez le Tripcount dans le tripSchema il doit être jeté à la Number SchemaType comme

var tripSchema = new Schema({ 
    _id: Number, 
    Tripcount: Number 
}, {collection: 'trips'}); 

module.exports = mongoose.model('Tripcount', tripSchema); 

et le schéma de la station

var stationSchema = new Schema({ 
    _id: Number, 
    StationName: String, 
    Tripcount: [{ type: Number, ref: 'Tripcount'}] 
}, {collection: 'stations'}); 

module.exports = mongoose.model('Station', stationSchema); 

Puis dans votre collection stations, les documents aurait idéalement la structure

{ 
    "_id": 1, 
    "StationName": "Station A", 
    "Tripcount": [1] 
} 

pour la méthode populate au travail, dont, lorsqu'elle est appliquée comme

Station.find().populate('Tripcount').exec(function(err, docs){ 
    if (err) throw err; 
    console.log(docs); 
    // prints { "_id": 1, "StationName": "Station A", "Tripcount": [{"_id": 1, Tripcount: 6 }] } 
}); 

approche alternative

Une autre approche que vous pourriez prendre si la collection de la station n'a pas Tripcount champ est à utiliser l'opérateur $lookup trouvé dans le cadre d'agrégation:

Station.aggregate([ 
    { 
     "$lookup": { 
      "from": "tripcollection", 
      "localField": "_id", 
      "foreignField": "_id", 
      "as": "trips" 
     } 
    }, 
    { 
     "$project": { 
      "StationName": 1, 
      "trips": { "$arrayElemAt": ["$trips", 0] } 
     } 
    }, 
    { 
     "$project": { 
      "StationName": 1, 
      "Tripcount": "$trips.Tripcount" 
     } 
    } 
]).exec(function(err, docs){ 
    if (err) throw err; 
    console.log(docs); 
    // prints [{ "_id": 1, "StationName": "Station A", "Tripcount": 6 }] } 
}); 
+0

Merci. J'ai tout changé selon votre suggestion, mais le facteur montre toujours 'Tripcount: []' pour tout. J'ai mis mes routes.js changé dans ma question. – ffritz

+0

Je pense que cela se résume au problème des gens qui ont des problèmes avec le tableau vide. – ffritz

+0

J'ai ajouté une alternative que vous pourriez essayer, basée sur le principe que la collection 'stations' est liée à la collection' trips' par les clés '_id'. – chridam