javascript - 如何在MongoDB中通用更新字段?

标签 javascript node.js mongodb mongoose

我有 1 个数据库:数据库。 数据库中有 2 个集合:usersposts。 Mongoose 架构:UserPost

这是一个用户:

{
  "_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/

相关文章:

mongodb - 引导对象时出现NoSuchMethodError:

javascript - 如何在 NestJS 过滤器中使用 @Catch() 接口(interface)

node.js - React JS : console. 调试不是一个函数

javascript - 配置 Express 和 Angular

session - 对 node.js、connect-mongo、 session 覆盖的并行请求

reactjs - 在 react 中保存 image._id

javascript - 在 JavaScript 跨浏览器中将字符串(UTF-8)编码为二进制数据

javascript - 无法获取水平滚动位置

javascript - 在菜单中切换链接?

node.js - 使用nodejs从另一个CoffeeScript文件中获取CoffeeScript文件