Mongoose's populate () не возвращает данные из базы данных - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть следующая схема, и Base является универсальным сборщиком информации:

const BaseSchema = mongoose.Schema({
  creatorId: { type: mongoose.Schema.Types.ObjectId, required: true },
  title: { type: String, required: true },
  created: { type: Date, default: Date.now() },
  users: [{ type: mongoose.Schema.Types.ObjectId, ref: "User" }],
  messages: [{ type: mongoose.Schema.Types.ObjectId, ref: "Message" }]
});

И

const BaseUserSchema = mongoose.Schema({
  userId: { type: String },
  baseId: { type: mongoose.Schema.Types.ObjectId },
  created: { type: Date, default: Date.now() },
  acceptedMembership: { type: Boolean, default: false },
  isCreator: { type: Boolean, default: false }
});

(у меня есть один для Message, который выглядит примерно так же) Последний упоминается как User в const User = mongoose.model("User", UserSchema); Когда я создаю новую базу, я автоматически добавляю пользователя в список. В БД я вижу, что пользователь существует, но когда я вызываю следующее поле не заполняется:

Base.find({ creatorId: req.params.id })
    .populate("users", "messages")
    .exec()
    .then(data => console.log(data));

Я получаю следующее из console.log:

[ { created: 2018-09-05T03:41:45.416Z,
    users: [],
    messages: [],
    _id: 5b8f508b2760c5329c13a9be,
    creatorId: 5b86f7970cd98b2004969bf0,
    title: 'testBase1',
    __v: 1 } ]

Когда я сначала создаю базу через интерфейс React, и база добавляется в список, я вижу, что users.length равен 1, или длине автоматически созданного пользователя. Однако когда я обновляю страницу, список пользователей в консоли становится пустым.

Добавление: Не забудьте показать, как я заполняю список пользователей при создании:

router.post("/add", jwtAuth, (req, res) => {
    Base.create({
        creatorId: req.body.userId,
        title: req.body.title
    }).then(baseInfo => {
        BaseUser.create({
            userId: req.body.username,
            baseId: baseInfo._id,
            created: Date.now(),
            acceptedMembership: true,
            isCreator: true
        })
            .then(baseuser => {
                baseInfo.users.push(baseuser);
                return baseInfo.save();
            })
            .then(base => res.json(base.serialize()));
    });
});

1 Ответ

0 голосов
/ 05 сентября 2018

Ответ

.populate("users", "messages")

для начала вернет messages из users. Это должны быть две отдельные записи, например:

        .populate("users")
        .populate("messages")

Тогда в модели

users: [{ type: mongoose.Schema.Types.ObjectId, ref: "User" }],

относится к неправильному ref. Это должно быть

users: [{ type: mongoose.Schema.Types.ObjectId, ref: "BaseUser" }],

от

const BaseUser = mongoose.model("BaseUser", BaseUserSchema);

Наконец, я не уверен, нужно ли это, но я добавил ref к каждому из подлежащих заполнению пунктов:

baseId: { type: mongoose.Schema.Types.ObjectId, required: true, ref: "Base" },
baseId: { type: mongoose.Schema.Types.ObjectId, ref: "Base" },

Теперь это работает как шарм, все без дополнительных fetch

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