J'essaie de créer une requête dans mon point de terminaison API qui récupère tous les documents et sous-documents. Actuellement, j'ai seulement eu de la chance pour récupérer les identifiants de chaque sous-document au lieu de récupérer toutes les informations dans chaque document. Est-il possible d'extraire les données de chaque sous-document en fonction de chaque ID en utilisant la mangouste (avec les données du document parent)?
J'ai suivi la documentation pour le remplissage en profondeur: https://mongoosejs.com/ docs / populate.html # deep-populate , mais n'ont pas eu beaucoup de chance.
Ceci est mon code actuel qui "fonctionne" mais ne répond qu'avec les ID de chaque sous-document ( et les données utilisateur, ce qui est bien ).
//The get request router.get("/allUsers", async (req, res) => { const allUsers = await User.find() .populate("Post") .exec(); res.send(allUsers); }); //User Schema const userSchema = Schema({ name: { type: String, required: true }, date: { type: Date, default: Date.now }, posts: [{ type: Schema.Types.ObjectId, ref: "Post" }] }); //Post Schema const postSchema = new mongoose.Schema({ name: { type: String, required: true }, description: { type: String, required: true } date: { type: Date, default: Date.now } });
Que me manque-t-il pour extraire TOUTES les informations des sous-documents au lieu de l'ID seul?
3 Réponses :
Passez le nom du champ à peupler
, pas le nom du modèle:
const allUsers = await User.find() .populate("posts") .exec();
Cela renvoie juste un tableau vide de messages, pourquoi?
Activez le débogage de la mangouste pour voir ce qu'elle fait: mongoose.set ('debug', true);
utilise populate à l'intérieur d'autres peuplements
.populate({ path: 'document', populate: { path: 'sub document'} })
Comme JohnnyHK l'a indiqué, vous devez utiliser le nom du champ à remplir.
Si vous avez un tableau de messages vide, veuillez vérifier votre collection d'utilisateurs si vous avez un tableau de messages avec les identifiants de publication.
Voici les étapes que je pourrais faire fonctionner:
1-) Inséré 2 messages comme celui-ci dans la collection de messages.
const mongoose = require("mongoose"); const postSchema = new mongoose.Schema({ name: { type: String, required: true }, description: { type: String, required: true }, date: { type: Date, default: Date.now }, userId: { type: mongoose.Schema.ObjectId, ref: "User" } }); const Post = mongoose.model("Post", postSchema); module.exports = Post;
2- ) A inséré un utilisateur avec ces 2 identifiants de messages.
const mongoose = require("mongoose"); const userSchema = new mongoose.Schema({ name: { type: String, required: true }, date: { type: Date, default: Date.now } }, { toJSON: { virtuals: true }, toObject: { virtuals: true } }); userSchema.virtual("posts", { ref: "Post", foreignField: "userId", localField: "_id" }) const User = mongoose.model("User", userSchema); module.exports = User;
3-) Et utilisé la route suivante pour obtenir les messages dans l'utilisateur.
[ { "posts": [ { "_id": "5dc6cd5d067a61191839ff37", "name": "name 2", "description": "description 2", "date": "2019-11-09T14:29:49.070Z", "__v": 0 }, { "_id": "5dc6cd65067a61191839ff38", "name": "name 3", "description": "description 3", "date": "2019-11-09T14:29:57.249Z", "__v": 0 } ], "_id": "5dc6cf5b67da8a40cc519866", "name": "user 1", "date": "2019-11-09T14:38:19.807Z", "__v": 0 } ]
Je suppose que j'ai eu une autre erreur ailleurs parce que cela ne fonctionnait toujours pas malheureusement. J'ai fini par utiliser simplement un tableau de messages au lieu de ne faire référence qu'à l'identifiant, mais en supposant que votre réponse est correcte.