Вам нужно добавлять сообщения в коллекцию вручную. Но вы можете улучшить свою реализацию, используя Populate
Заполнение - это процесс автоматической замены указанных путей в документе документами из других коллекций
У вас может быть хороший обзор Populate
здесь
Основное преимущество использования populate заключается в том, что в коллекции сохраняется ссылка _id
документа, и если вам необходимо обновить любой вложенный документ, OsrsMessage
в вашем случае, вам не нужно обновлять / повторно вставлять его в User
.
Документация заполнить имеет хороший обзор того, как вы можете его использовать. Я надеюсь, что это поможет вам улучшить вашу текущую реализацию.
Вы можете написать таким образом,
const UserSchema = new Schema({
username: {
type: String,
required: true,
unique: true
},
email: {
type: String,
required: true,
unique: true,
},
password: {
type: String,
required: true,
},
register_date: {
type: Date,
default: Date.now
},
osrs_messages: [{ type: Schema.Types.ObjectId, ref: 'OsrsMessage' }]
});
Добавьте в свой код сообщение следующим образом:
router.post("/osrs", verifyAccessToken, async (req, res) => {
try {
const { username, message } = req.body;
// create a new message and save
let newMessage = new OsrsMessage({ username, message });
newMessage = await newMessage.save();
// get the associated user and add new message to messages array
let user = await User.findById(req.user.id);
user.osrs_messages.push(newMessage._id);
user = await user.save();
return res.status(200).json({ message: "message received" });
} catch (error) {
console.log("error message:", error);
return res
.status(500)
.json({ message: "Oops... looks like something went wrong" });
}
});
После этого, когда вам нужно получить пользователя с сообщением, вы можете выполнить такой запрос
const user = await User.
findById(req.user.id).
populate({ path: 'osrs_messages'}).
exec();
Здесь вы получите пользователя со всеми osrs_messages
в виде списка