Как сказал ДжонниХК, для заполнения необходимо использовать имя поля.
Если у вас пустой массив сообщений, проверьте свою коллекцию пользователей, если у вас есть массив сообщений с идентификаторами сообщений.
Вот шаги, которые я мог бы заставить его работать:
1-) Вставил 2 сообщения, подобные этой, в коллекцию сообщений.
{
"_id" : ObjectId("5dc6cd65067a61191839ff38"),
"name" : "name 3",
"description" : "description 3",
"date" : ISODate("2019-11-09T17:29:57.249+03:00")
}
{
"_id" : ObjectId("5dc6cd5d067a61191839ff37"),
"name" : "name 2",
"description" : "description 2",
"date" : ISODate("2019-11-09T17:29:49.070+03:00")
}
2-) Вставил пользователя сэти 2 сообщения id.
{
"_id" : ObjectId("5dc6cf5b67da8a40cc519866"),
"posts" : [
ObjectId("5dc6cd5d067a61191839ff37"),
ObjectId("5dc6cd65067a61191839ff38")
],
"name" : "user 1",
"date" : ISODate("2019-11-09T17:38:19.807+03:00")
}
3-) И использовали следующий маршрут для получения сообщений от пользователя.
router.get("/allUsers", async (req, res) => {
const allUsers = await User.find().populate("posts");
res.send(allUsers);
});
Результат примерно такой:
[
{
"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
}
]
Кстати ваш пользователь и пост-моделирование не идеальны. Каждый раз, когда пользователь публикует пользовательский документ, он должен обновляться.
Я бы использовал следующие схемы (родительские ссылки).
Модель пользователя (я удалил поле сообщений и добавил виртуальную функцию)
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;
Опубликовать модель (я добавил userId)
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;
Таким образом, пользовательский документ не затрагивается, когда пользователь публикует сообщения. И вы можете использовать тот же маршрут / allUsers, чтобы получать пользователей с включенными в них сообщениями.