метод заполнения в мангусте (узел js) - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь использовать populate () в узле js. Я пытаюсь получить доступ к objectId одной коллекции в другую. например, у меня есть коллекции под названием Project и события, где у меня есть такая схема.

Схема проекта:

const projectSchema = mongoose.Schema({
    _id: mongoose.Schema.Types.ObjectId,
    projectName: {
        type: String,
        required: true,
        unique: true
    },
    dimensions: {
        type: [],
        required: false
    },
    events: {
        [type: mongoose.Schema.Types.ObjectId],
        ref: 'EnrichedEvent'
    },
});
module.exports = mongoose.model('Project', projectSchema);

Схема событий:

const enrichedEventSchema = mongoose.Schema({
    _id: mongoose.Schema.Types.ObjectId,
    projectId: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Project',
        required: true
    },
    name: {
        type: String,
        required: true
    },
    type: {
        type: String,
        enum: ["Enriched"],
        required: true
    },
    source: {
        type: String,
        required: true
    },
});

и код маршрутизации для проектов:

 const express = require("express");
 const router = express.Router();
 const mongoose = require("mongoose");
 const Project = require("../models/project");

 router.get("/", (req, res, next) => {
     Project.find()
         .populate('source', 'EnrichedEvents') //When i use this populate method, I m not able to GET any events on to browser..
         .exec()
         .then(docs => {
             const response = {
                 count: docs.length,
                 projects: docs.map(doc => {
                     return {
                         projectName: doc.projectName,
                         dimensions: doc.dimensions,
                         events: doc.events,
                         _id: doc._id
                     };
                 })
             };
             res.status(200).json(response);
         })
         .catch(err => {
             console.log(err);
             res.status(500).json({
                 error: err
             });
         });
 });

 router.post("/", (req, res, next) => {
     const project = new Project({
         _id: new mongoose.Types.ObjectId(),
         projectName: req.body.projectName,
         events: req.body.events
     });
     project
         .save()
         .then(result => {
             console.log(result);
             res.status(201).json({
                 message: "Created project successfully",
                 createdProject: {
                     projectName: result.projectName,
                     _id: result._id,
                     events: result.events,
                 }
             });
         })
         .catch(err => {
             console.log(err);
             res.status(500).json({
                 error: err
             });
         });
 });

 module.exports = router;

моя проблема в том, что я не могу автоматически заполнить обогащенную eventsId страницу проектов. например Всякий раз, когда я обновляю события, они должны появляться на странице проектов. Но этого не происходит. На странице событий также я не получаю соответствующий идентификатор проекта. пожалуйста, направьте меня в правильном направлении.

1 Ответ

0 голосов
/ 04 мая 2018

Заполните метод принимает FIELD_TO_POPULATE и FIELDS_TO_RETURN_FROM_POPULATED_DOC, и вы передаете его в обратном направлении. Также в схеме вашего проекта вы использовали events для EnrichedEvent, поэтому при заполнении используйте events, а не EnrichedEvent;

Попробуйте следующее:

От:

.populate('source', 'EnrichedEvents')

TO:

.populate('events', 'EnrichedEvent')

Редактировать:

обновить схему для EnrichedEvent:

events: [{
 mongoose.Schema.Types.ObjectId, 
 ref: 'EnrichedEvent'
}]

Это должно работать сейчас.

...