Mongoose: Comment interroger une propriété d’object référencée?

J’essaie d’obtenir une liste de documents de ma firebase database basée sur la propriété d’un sous-document. Les modèles et schémas que j’utilise sont les suivants:

var elementSchema = new mongoose.Schema({ name: Ssortingng, description: Ssortingng, _story: { type: mongoose.Schema.Types.ObjectId, ref: 'Story' }, date_created: Date, date_modified: Date, }; var storySchema = new mongoose.Schema({ title: {type: Ssortingng, default: '', sortingm: true}, isPrivate: {type: Boolean, default: false}, }); mongoose.model("Story", storySchema); mongoose.model("Element", elementSchema); 

J’essaie d’obtenir tous les éléments appartenant à une histoire qui n’est pas privée, et selon certains articles que j’ai vus ici ( 1 , 2 , 3 ), la solution serait d’utiliser _story.isPrivate avec find. Je suis en train de faire ça:

 Element.find({'_story.isPrivate': false}) .populate('_story') .exec(function(err, elements){ if(err){ return next(err); } else if(elements.length > 0){ return res.send(elements); } else{ return res.send(404, {message: "No elements found"}); } }); 

Mais le résultat est toujours un ensemble vide (retourne 404). En l’absence de condition, find renvoie tous les éléments et remplit correctement _story. J’ai aussi activé la sortie de débogage pour voir les requêtes en cours d’exécution et j’obtiens ceci:

 Mongoose: elements.find({ '_story.isPrivate': false }) { fields: undefined, safe: undefined } 

Essayer d’exécuter ceci dans MongoDB je n’obtiens aucun résultat. Qu’est-ce qui ne va pas ici?

Merci

Écoutez @JohnnyHK. Il dit la vérité. Les requêtes Mongodb utilisent les données dans une, une seule et exactement une collection à la fois. Comme les documents de la collection ‘elements’ n’ont jamais de chemin d’access à la clé _story.isPrivate , Element.find({'_story.isPrivate': false}) ne correspondra à aucun document. Il n’y a pas de jointure dans mongodb. Vraiment. Cependant, étant donné la contrainte “pas de jointure”, il est toujours possible de créer une application et de répondre à des cas d’utilisation, mais vous avez besoin de schémas et de conceptions de requête alternatifs. Parfois, les gens dénormalisent leurs données et dupliquent des éléments. Parfois, vous exécutez plusieurs requêtes connexes, etc., etc.

Vous pouvez commander à nouveau votre modèle et avoir

 var storySchema = new mongoose.Schema({ title: {type: Ssortingng, default: '', sortingm: true}, isPrivate: {type: Boolean, default: false}, elements: [{type: mongoose.Schema.Types.ObjectId, ref: 'Element'}] }); Story.distinct('elements', {'isPrivate':false}, function(error, results) { /* handle callback */ } 

De cette manière, vous pouvez émettre un seul appel et obtenir un agrandissement d’éléments.