Заполнение мангуста не заполняет массив

Я часами боролся с функцией mongoose.model.populate. Я даже попытался напрямую скопировать и вставить несколько решений, но безуспешно.

У меня есть модель пользователя, которая должна содержать массив «Дилемм», который он / она создал, но я не смог его заполнить.

Вот модели, а также реализация populate().

User.js

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

// Create Schema
const UserSchema = new Schema({
  username: {
    type: String,
    required: true
  },
  email: {
    type: String,
    required: true
  },
  password: {
    type: String,
    required: true
  },
  date: {
    type: Date,
    default: Date.now
  },
  dilemmas: [
    {
      type: Schema.Types.ObjectId,
      ref: "Dilemma"
    }
  ]
});

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

Dilemma.js

const mongoose = require("mongoose");
const slug = require("mongoose-slug-generator");
const Schema = mongoose.Schema;
mongoose.plugin(slug);

// Create Schema
const DilemmaSchema = new Schema({
  creator: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "User"
  },
  title: {
    type: String
  },
  slug: {
    type: String,
    slug: "title"
  },
  red: {
    type: String,
    required: true
  },
  blue: {
    type: String,
    required: true
  },
  red_votes: {
    type: Number,
    default: 0,
    required: true
  },
  blue_votes: {
    type: Number,
    default: 0,
    required: true
  },
  likes: [
    {
      user: {
        type: Schema.Types.ObjectId,
        ref: "User"
      }
    }
  ],
  comments: [
    {
      user: {
        type: Schema.Types.ObjectId,
        ref: "User"
      },
      text: {
        type: String,
        required: true
      },
      author: {
        type: String
      },
      avatar: {
        type: String
      },
      date: {
        type: Date,
        default: Date.now
      }
    }
  ],
  date: {
    type: Date,
    default: Date.now
  }
});

module.exports = Dilemma = mongoose.model("Dilemma", DilemmaSchema, "dilemmas");

Routes.js

// @route   GET api/users/profile
// @desc    Gets logged in user's profile
// @access  Private
router.get(
  "/profile",
  passport.authenticate("jwt", { session: false }),
  (req, res) => {
    User.find({ username: req.user.username })
      .populate("dilemmas")
      .then(user => {
        if (!user) {
          errors.nouser = "There is no user";
          return res.status(404).json(errors);
        }
        res.json(user);
      })
      .catch(err => res.status(400).json(err));
  }
);

Ответ JSON

[
    {
        "_id": "5b807beef770e7c7e6bf7ce0",
        "dilemmas": [],
        "username": "Jonas",
        "email": "[email protected]",
        "password": "$2a$10$QaqljS9x08YQ9N9EuCBTpO114ZJUFuVxAV80xMzImNi8eW2frPg0C",
        "date": "2018-08-24T21:43:10.411Z",
        "__v": 0
    }
]

Ответ JSON Dilemmas

[
    {
        "red_votes": 0,
        "blue_votes": 0,
        "_id": "5b80975f6e47fecba621f295",
        "user": "5b807beef770e7c7e6bf7ce0",
        "title": "Am i the real author asdsdasd?",
        "red": "This is the red dilemma",
        "blue": "This is the blue dilemma",
        "likes": [],
        "comments": [],
        "date": "2018-08-24T23:40:15.381Z",
        "slug": "am-i-the-real-author-asdsdasd",
        "__v": 0
    },
    {
        "red_votes": 0,
        "blue_votes": 0,
        "_id": "5b808e789bc36bcae8c6c3ad",
        "creator": "5b807beef770e7c7e6bf7ce0",
        "title": "Am i the real author?",
        "red": "This is the red dilemma",
        "blue": "This is the blue dilemma",
        "likes": [],
        "comments": [],
        "date": "2018-08-24T23:02:16.565Z",
        "slug": "am-i-the-real-author",
        "__v": 0
    }
]

Ответ пользователей JSON

{
    "_id": {
        "$oid": "5b807beef770e7c7e6bf7ce0"
    },
    "dilemmas": [],
    "username": "Jonas",
    "email": "[email protected]",
    "password": "$2a$10$QaqljS9x08YQ9N9EuCBTpO114ZJUFuVxAV80xMzImNi8eW2frPg0C",
    "date": {
        "$date": "2018-08-24T21:43:10.411Z"
    },
    "__v": 0
}

не могли бы вы опубликовать свои образцы коллекций для обоих документов

Ashh 25.08.2018 06:18

заполнить ({путь: "путь", модель: "модель"})

Suhayb 27.08.2018 18:18

@AnthonyWinzlet, я обновил коллекции.

Jonas Mohr Pedersen 27.08.2018 21:25

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

dikuw 27.08.2018 21:30

@ Майкл, я могу попробовать. Я еще не создал представление, но сообщу вам, как только закончу.

Jonas Mohr Pedersen 27.08.2018 21:31

У вас нет идентификаторов объектов dilemmas в коллекции пользователей ... "dilemmas": [],

Ashh 27.08.2018 21:45

@AnthonyWinzlet, у меня возникла идея, что заполнить массив дилемм идентификаторами объектов, поскольку они ссылаются друг на друга, потому что у дилемм есть «создатель» с целью пользователя, который их создал.

Jonas Mohr Pedersen 28.08.2018 10:10
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
7
1 601
3

Ответы 3

Вы пробовали это?

User.find({ username: req.user.username })
  .populate("dilemmas")
  .exec() // <-- add exec() to perform the search
  .then(user => {
    ...
  })

Вы уверены, что у вас есть дилеммы в базе данных для пользователя Jonas?

Baboo 25.08.2018 01:39

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

Jonas Mohr Pedersen 25.08.2018 01:41

Я спрашиваю об этом, потому что ответ JSON имеет пустой массив dilemmas без какого-либо objectId в нем

Baboo 25.08.2018 01:46

Да, в этом вся проблема. JSON в сообщении - это ответ от маршрута профиля, который должен содержать все dilemmas, созданные пользователем. Я подтвердил, что в базе данных существует dilemmas с таким же идентификатором автора, как и у user.

Jonas Mohr Pedersen 25.08.2018 01:51

Вы проверяли здесь документацию?

https://mongoosejs.com/docs/populate.html#refs-to-children

Он показывает аналогичную установку (с авторами и рассказами). Он упоминает «подталкивание» историй, чтобы иметь возможность использовать комбинацию find / populate.

Да, я читал это раньше и пытался воспроизвести то, что они показали, для моего проекта. Но вроде ничего не работает ...

Jonas Mohr Pedersen 25.08.2018 01:43

Я сам столкнулся с подобной проблемой. Заполнение ссылки сработало, но заполнение массива ссылок - нет. Мне удалось заставить заполнить массив для работы, явно указав имя модели в вызове заполнения, например:

User.find({ ... }).populate({
  path: 'dilemmas',
  model: 'Dilemma',
});

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

Другие вопросы по теме