更新 mongodb 集合的问题
problems to update mongodb collection
所以我的社交媒体应用程序有两个不同的集合。一个给用户,另一个给用户的 post。每当我从我的一个用户的集合中更新信息时,它也应该在 post 上修改它(因为我的 post 集合也包含来自用户的数据),但它只在 posts 是我在那之后创建的,而不是我之前创建的那些。我该如何解决?
用户架构
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 架构
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 模型上存储任何 user-related 数据。这样,每次您查询 posts 时,它都会自动通过其 id 提取最新的匹配用户模型。
myPost.populate('user')
请注意,因此 ref
是必需的,它告诉 mongoose 如何 填充 用户字段。
所以我的社交媒体应用程序有两个不同的集合。一个给用户,另一个给用户的 post。每当我从我的一个用户的集合中更新信息时,它也应该在 post 上修改它(因为我的 post 集合也包含来自用户的数据),但它只在 posts 是我在那之后创建的,而不是我之前创建的那些。我该如何解决?
用户架构
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 架构
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 模型上存储任何 user-related 数据。这样,每次您查询 posts 时,它都会自动通过其 id 提取最新的匹配用户模型。
myPost.populate('user')
请注意,因此 ref
是必需的,它告诉 mongoose 如何 填充 用户字段。