所以我的社交媒体应用程序有两个不同的集合。一个用于用户,另一个用于该用户的帖子。每当我更新用户收藏中的信息时,它也应该在帖子上进行修改(因为我的帖子收藏也包括用户的数据(,但它只在我之后创建的帖子上进行,而不是在我之前创建的帖子中。我该怎么修?
用户方案
const userSchema = new Schema({
name: { type: String, required: true },
lastname: { type: String, required: true },
username: { type: String, required: true },
email: { type: String, required: true },
password: { type: String, required: true, minlength: 8 },
avatar: { data: Buffer, contentType: String },
});
POST SCHEMA
const postSchema = new Schema({
user: { type: mongoose.Schema.Types.ObjectId, ref: "User" },
name: { type: String, required: true },
lastname: { type: String },
username: { type: String },
avatar: { data: Buffer, contentType: String },
date: { type: Date, default: Date.now() },
textOfThePost: { type: String, required: true },
});
编辑功能EXPRESS/MONGOOSE
router.put("/edit_profile", async (req, res) => {
try {
const { name, lastname, username } = req.body;
const user = await User.findById(req.user).select("-password");
if (!user) return res.status(404).json("User doesn't exists");
if (name) user.name = name;
if (lastname) user.lastname = lastname;
if (username) user.username = username;
await user.save();
res.json(user);
} catch (err) {
res.status(500).json({ error: err.message });
}
};
您可以为此目的使用updateMany()
。
const res = await Post.updateMany({ user: user.id }, { name: user.name, username: user.username /* ... */ });
然而,正如已经指出的,您在post模型和用户模型上存储了冗余的用户数据,这是不必要的。与SQL中的联接类似,您可以简单地使用populate()
,而不在post模型中存储任何与用户相关的数据。这样,每次你查询你的帖子时,它都会自动根据id提取最新匹配的用户模型。
myPost.populate('user')
请注意,因此ref
是必需的,它告诉mongoose如何填充用户字段。