Requête nestede Mongoose sur le modèle par champ de son modèle référencé

Il semble y avoir beaucoup de questions / réponses sur le sujet du stackoverflow, mais je n’arrive pas à trouver une réponse exacte nulle part.

Ce que j’ai:

J’ai des modèles de société et de personne:

var mongoose = require('mongoose'); var PersonSchema = new mongoose.Schema{ name: Ssortingng, lastname: Ssortingng}; // company has a reference to Person var CompanySchema = new mongoose.Schema{ name: Ssortingng, founder: {type:Schema.ObjectId, ref:Person}}; 

Ce dont j’ai besoin:

Trouvez toutes les entresockets que les personnes avec le nom “Robertson” ont fondées

Ce que j’ai essayé:

 Company.find({'founder.id': 'Robertson'}, function(err, companies){ console.log(companies); // getting an empty array }); 

Ensuite, j’ai pensé que Person n’était pas incorporé, mais référencé. J’ai donc utilisé populate pour renseigner le fondateur-Person, puis essayé d’utiliser find avec le nom ‘Robertson’.

 // 1. resortingeve all companies // 2. populate their founders // 3. find 'Robertson' lastname in populated Companies Company.find({}).populate('founder') .find({'founder.lastname': 'Robertson'}) .exec(function(err, companies) { console.log(companies); // getting an empty array again }); 

Je peux toujours interroger les entresockets dont l’identifiant est une chaîne. Mais ce n’est pas exactement ce que je veux, comme vous pouvez le comprendre

 Company.find({'founder': '525cf76f919dc8010f00000d'}, function(err, companies){ console.log(companies); // this works }); 

Vous ne pouvez pas faire cela dans une requête unique car MongoDB ne prend pas en charge les jointures. Au lieu de cela, vous devez le diviser en quelques étapes:

 // Get the _ids of people with the last name of Robertson. Person.find({lastname: 'Robertson'}, {_id: 1}, function(err, docs) { // Map the docs into an array of just the _ids var ids = docs.map(function(doc) { return doc._id; }); // Get the companies whose founders are in that set. Company.find({founder: {$in: ids}}, function(err, docs) { // docs contains your answer }); }); 

Au cas où quelqu’un le rencontrerait plus récemment, Mongoose prend désormais en charge les fonctionnalités de jointure avec une fonctionnalité appelée Populate.

De la documentation Mongoose:

 Story. findOne({ title: 'Casino Royale' }). populate('author'). exec(function (err, story) { if (err) return handleError(err); console.log('The author is %s', story.author.name); // prints "The author is Ian Fleming" 

});

http://mongoosejs.com/docs/populate.html