我有 1 个数据库:数据库
。
数据库中有 2 个集合:users
、posts
。
Mongoose 架构:User
、Post
。
这是一个用户
:
{
"_id": "5f0e99abef55507333f0c34ef45",
"name": "David",
"email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="026663746b6642676f636b6e2c616d6f" rel="noreferrer noopener nofollow">[email protected]</a>"
}
我可以向用户
发布
一些内容并将其保存到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();
这是带有 by
字段的新 post
:
"_id": "3287327392392293243434",
"post": "this is david's post",
"by": {
"_id": "5f0e99abef55507333f0c34ef45",
"name": "David",
"email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="84e0e5f2ede0c4e1e9e5ede8aae7ebe9" rel="noreferrer noopener nofollow">[email protected]</a>"
}
然后我将我的个人资料更新为:
{
"_id": "5f0e99abef07333f0c34ef45",
"name": "Dave", // change from David to Dave
"email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b1d5d0c7d8d5f1d4dcd0d8dd9fd2dedc" rel="noreferrer noopener nofollow">[email protected]</a>"
}
此后,我发送一个 get
请求来获取所有帖子:
[{
"_id": "3287327392392293243434",
"post": "this is david's post",
"by": {
"_id": "5f0e99abef07333f0c34ef45",
"name": "David",
"email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a0c4c1d6c9c4e0c5cdc1c9cc8ec3cfcd" rel="noreferrer noopener nofollow">[email protected]</a>"
},
}]
问题是 by
字段具有相同的对象,在我更新我的名字后,这里没有任何更新。仍然是大卫,而不是戴夫。我知道当我更新我的个人资料时,我只更新了用户,而不是帖子。我也可以编写类似更新帖子的代码,但如果我有很多帖子、很多评论,并且我定期更改我的姓名、图像、传记或其他字段,那么更新我的个人资料时会发生太多事情(可能有数千件事)帖子数)。
我想要的是,当我更新我的用户
个人资料时,有没有办法在这个 MongoDB 数据库中进行更新?就像我希望 post
中的 by
字段显示我更新后的姓名一样。
这与用户模式有关吗?
最佳答案
您面临的问题是因为您在数据库中保存了用户的重复数据,一次保存在用户集合中,一次保存在后期收集中。数据库中不应有重复的数据。
不要将完整的用户数据保存在每个帖子文档的 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
的值应与作为第一个参数传递给 mongoose.model()
函数的字符串相同。例如,如果在用户架构文件中,您调用 mongoose.model('User', userSchema)
,则后架构中 ref
属性的值应为 '用户'
看看Mongoose - Populate() 。此功能将允许您获取与任何特定帖子文档链接的用户数据。
关于javascript - 如何在MongoDB中通用更新字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62912661/