gpt4 book ai didi

javascript - 如何在 MongoDB 中普遍更新字段?

转载 作者:行者123 更新时间:2023-12-04 09:29:06 27 4
gpt4 key购买 nike

我有 1 个数据库:database .
数据库中有 2 个集合:users , posts .
Mongoose 模式:User , Post .
这是一个 user :

{
"_id": "5f0e99abef55507333f0c34ef45",
"name": "David",
"email": "david@email.com"
}
我可以 postuser 的东西并将其保存到 posts收藏。
let user = await User.findById(req.user.id);
let newPost = new Post({
post: req.body.post,
by: user, // this is the important part
});
await newPost.save();
这是新的 postby field :
"_id": "3287327392392293243434",
"post": "this is david's post",
"by": {
"_id": "5f0e99abef55507333f0c34ef45",
"name": "David",
"email": "david@email.com"
}
然后我 update我的个人资料:
{
"_id": "5f0e99abef07333f0c34ef45",
"name": "Dave", // change from David to Dave
"email": "david@email.com"
}
在此之后,我发送了一个 get请求获取所有帖子:
[{
"_id": "3287327392392293243434",
"post": "this is david's post",
"by": {
"_id": "5f0e99abef07333f0c34ef45",
"name": "David",
"email": "david@email.com"
},
}]
问题在于 by字段具有相同的对象,在我更新我的名字后,这里没有任何更新。仍然是大卫而不是戴夫。我知道当我更新我的个人资料时,我只更新了用户,而不是帖子。我也可以编写代码来更新帖子,但是如果我有很多帖子,很多评论,并且我经常更改我的姓名、图片、传记或其他字段,那么在更新我的个人资料时会发生太多事情(可能还有数千的帖子)。
我想要的是当我更新我的 user profile,有没有办法在这个 MongoDB 数据库中更新?就像我想要的那样 by post 中的字段显示我更新后的名字。
它与用户架构有关吗?

最佳答案

您面临的问题是因为您在数据库中保存了用户的重复数据,一次是在用户集合中,一次是在后期集合中。您的数据库中不应有重复的数据。
而不是在 by 中保存完整的用户数据每个帖子文档的字段,仅保存用户的 ID 并使用 SchemaType.prototype.ref() 链接用户文档和帖子文档.这样,您的数据库中不会有重复的数据,您现在面临的问题将得到解决。
发布架构应该像:

let postSchema = new mongoose.Schema({
post: String,
by: { type: Schema.Types.ObjectId, ref: 'User' } // link between post and a user
});
和用户架构应该看起来像:
let userSchema = new mongoose.Schema({
name: String,
email: String
});
请记住 ref 的值在 post schema 中应该与您作为第一个参数传递给 mongoose.model() 的字符串相同功能。例如,如果在用户架构文件中,您调用 mongoose.model('User', userSchema)那么 ref的值帖子架构中的属性应该是 'User'看看 Mongoose - Populate() .此功能将允许您获取与任何特定发布文档链接的用户数据。

关于javascript - 如何在 MongoDB 中普遍更新字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62912661/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com