我有一个用户和一个消息模型。关系如下:一个用户可以有很多消息。
目标:我正在寻找添加新消息并将其链接到相应用户的最佳或最优雅的方法。
用户模型:
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: [OsrsMessage]
});
消息模型:
const OsrsMessageSchema = new Schema({
message: {
type: String,
required: true,
},
username: {
type: String,
required: true,
unique: true,
},
send_date: {
type: Date,
default: Date.now
}
});
我的路由器添加新消息并将消息添加到相关用户:
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({ username, message });
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" });
}
});
有什么办法可以改善这个状况?我应该使用findOneAndUpdate
还是insert
代替?如果我将消息链接到用户,是否可以将消息自动添加到我的消息集中?还是必须始终手动将其添加到消息集中?
您需要手动将消息添加到集合中。但是您可以通过使用Populate
填充是自动用其他集合中的文档替换文档中指定路径的过程
您可以在这里有一个很好的概述Populate
使用集合的主要优点是,在集合中保留了_id
文档的引用,如果需要更新任何嵌套的文档,OsrsMessage
则无需将其更新/重新插入User
。
populate的文档很好地概述了如何使用它。我希望这将帮助您改善当前的实施。
你可以这样写
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
的列表
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句