Не удается получить populate () для заполнения массива в Mongoose - PullRequest
0 голосов
/ 12 декабря 2018

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

У меня есть две модели: Пользователь и Глава : Глава может иметь много членов ( Пользователи ).Когда я делаю router.get('/chapters'), я хочу видеть массив всех Users , связанных с Chapter , как свойство вместе с другими Chapter свойствами, вот так:

[
    {
        "leads": [],
        "members": [
           {"_id":"someString1","firstName":"...", "lastName":"..."},
           {"_id":"someString2","firstName":"...", "lastName":"..."},
        ],
        "date": "2018-12-12T15:24:45.877Z",
        "_id": "5c11283d7d13687e60c186b3",
        "country": "5c11283d7d13687e60c185d6",
        "city": "Buckridgestad",
        "twitterURL": "qui",
        "bannerPic": "http://lorempixel.com/640/480/people",
        "__v": 0
    }
]

Но я получаю вот что:

  [
        {
            "leads": [],
            "members": [],
            "date": "2018-12-12T15:24:45.877Z",
            "_id": "5c11283d7d13687e60c186b3",
            "country": "5c11283d7d13687e60c185d6",
            "city": "Buckridgestad",
            "twitterURL": "qui",
            "bannerPic": "http://lorempixel.com/640/480/people",
            "__v": 0
        }
    ]

Это мои схемы:

Глава

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

// Create Schema
const ChapterSchema = new Schema({
  country: {
    type: Schema.Types.ObjectId,
    ref: "countries"
  },
  city: {
    type: String,
    required: true
  },
  leads: [
    {
      type: Schema.Types.ObjectId,
      ref: "users"
    }
  ],
  members: [
    {
      type: Schema.Types.ObjectId,
      ref: "users"
    }
  ],
  twitterURL: {
    type: String,
    required: true
  },
  bannerPic: {
    type: String,
    required: true
  },
  date: {
    type: Date,
    default: Date.now()
  }
});

module.exports = Chapter = mongoose.model("chapters", ChapterSchema);

Пользователь

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

// Create Schema
const UserSchema = new Schema({
  username: {
    type: String,
    required: true
  },
  firstName: {
    type: String,
    required: true
  },
  lastName: {
    type: String,
    required: true
  },
  organisation: {
    type: String,
    required: true
  },
  chapter: {
    type: Schema.Types.ObjectId,
    ref: "chapters"
  },
  email: {
    type: String,
    required: true
  },
  admin: {
    type: Boolean,
    default: false
  },
  lead: {
    type: Boolean,
    default: false
  },
  password: {
    type: String,
    required: true
  },
  date: {
    type: Date,
    default: Date.now()
  }
});

module.exports = User = mongoose.model("users", UserSchema);

Как я уже сказал, когда я вызываю конечную точку, я хочу, чтобы она вернула мне все глав со всеми Пользователи как заполненное свойство.

Я пробовал множество вариантов .populate () , но чтобы знать удачу.Самое близкое, что я получил, проходило через ранние уровни ада обратного вызова, которые, как я знаю, не нужны в сегодняшних технологиях, но ничего не работает!

Мои route / api / chapters.js

// @route    GET api/chapters
// @desc     Get all Chapters
// @access   Public

router.get("/", (req, res) => {
  Chapter.find()
    .populate("members")
    .then(chapters => {
      return res.json(chapters);
    })
    .catch(err =>
      res.status(404).json({ nochaptersfound: "No Chapters found" })
    );
});

Я могу заставить его работать наоборот:

Мои routs / api / users.js

// @route    GET api/users
// @desc     Return all users
// @access   Public

router.get("/", (req, res) => {
  User.find()
    .populate("chapter")
    .exec()
    .then(users => res.status(200).json(users))
    .catch(err => console.log(err));

Возвращает aпользователь с заполненным Chapter , но я не могу заполнить chapter.members array

Любая помощь будет принята с благодарностью!

Спасибо!!

1 Ответ

0 голосов
/ 12 декабря 2018

Из вашего комментария я считаю, что вы на самом деле не храните пользователей в своих главах.То, что вы делаете, это:

User.create({..., chapter: id})...

И предположим, что глава теперь имеет пользователя.Это не так, как это работает с мангустом, поэтому, если вы хотите сохранить в обоих местах, вам нужно будет сделать это самостоятельно.Вы думаете об этом, как если бы это была реляционная база данных

Вам нужно будет сделать что-то вроде:

const user = await User.create({..., chapter: id})
const chapter = await Chapter.findOne({ _id: id })
chapter.members.push(user)
chapter.save()

Если ваше заполнение не работает, вы не получите пустуюмассив, вы получите массив с идентификаторами.Ваш текущий заполненный запрос в порядке, у вас просто нет данных для заполнения

С обещаниями это будет выглядеть так:

var userPromise = User.create({..., chapter: id}).exec()
var chapterPromise = Chapter.findOne({ _id: id }).exec()
Promise.all([userPromise, chapterPromise]).then((user, chapter) => {
  chapter.members.push(user)
  return chapter.save()
}).then(chapter => {
  // send response
})

Если вам нужно 10 глав с 10 по 50пользователей, я бы создал 50 пользователей, затем вставил их всех в главы и сохранил главу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...