0
votes

Est-il possible de récupérer toutes les données avec la population en mangouste avec ID?

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?


0 commentaires

3 Réponses :


1
votes

Passez le nom du champ à peupler , pas le nom du modèle:

const allUsers = await User.find()
  .populate("posts")
  .exec();


2 commentaires

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);



0
votes

utilise populate à l'intérieur d'autres peuplements

.populate({
      path: 'document',
      populate: { path: 'sub document'}
    })


0 commentaires

0
votes

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
    }
]


1 commentaires

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.