当前位置: 首页 > 知识库问答 >
问题:

mongodb - 更新时我们需要发送所有的字段,而不仅仅是要更新的字段吗?

申屠锦
2024-03-18

更新时我们需要发送所有的字段,而不仅仅是要更新的字段吗?

在做fullstackopen的练习的时候,对这个题目描述不解?当我们只需更新likes字段,需要将其他的字段信息也放到请求中吗?

image.png

对这个项目做一个简短的介绍
使用到的一些技术: mongodbreactaxios(用于前端和后端通信)、expressrestful
后端相关的操作如下所示

blogRouter.put("/:id", async (request, response) => {  const body = request.body;  const blog = {    title: body.title,    author: body.author,    url: body.url,    likes: body.likes,  };  const updateBlog = await Blog.findByIdAndUpdate(request.params.id, blog, {    new: true,    runValidators: true,  }).populate("user", { username: 1, name: 1 });  if (updateBlog) {    response.send(updateBlog);  } else {    response.status(404).end();  }});
  • 经过测试发现,findByIdAndUpdate应该只会更新我们通过参数传送的字段,而其他的会保持不变。
  • 我使用postman测试,只需要发送一个likes字段的信息就可以达到预期的效果,只更改了likes字段,其他保持不变。
    那为什么题目还说要发送所有的字段呢?
    image.png

博客的schema定义

const mongoose = require("mongoose");const blogSchema = new mongoose.Schema({  title: { type: String, required: true },  author: String,  url: { type: String, required: true },  likes: { type: Number, default: 0 },  user: {    type: mongoose.Schema.Types.ObjectId,    ref: "User",  },});// https://mongoosejs.com/docs/api/document.html#Document.prototype.toJSON()blogSchema.set("toJSON", {  transform: (doc, ret) => {    // transform the unqiue identifier into a string representing.    ret.id = ret._id.toString();    delete ret._id;    // we don't require information about the mongodb version.    delete ret.__v;  },});module.exports = mongoose.model("Blog", blogSchema);

共有2个答案

严修诚
2024-03-18

(脑子一时锈掉了)后端操作要提取出博客的author、url、likes等信息,如果我只包含likes的话,其他的值就是会是undefined,这些undefined将会作为值取更新对应的字段,所以要将其他的也一并包含。

blogRouter.put("/:id", async (request, response) => {  const body = request.body;  const blog = {    title: body.title,    author: body.author,    url: body.url,    likes: body.likes,  };  const updateBlog = await Blog.findByIdAndUpdate(request.params.id, blog, {    new: true,    runValidators: true,  }).populate("user", { username: 1, name: 1 });  if (updateBlog) {    response.send(updateBlog);  } else {    response.status(404).end();  }});
松国兴
2024-03-18

在 RESTful API 设计中,通常,当你要更新一个资源时,你只需要发送需要更新的字段。这是因为 HTTP PUT 方法是幂等的,意味着多次执行相同的请求应该产生相同的结果。如果你只发送需要更新的字段,那么无论请求被发送多少次,结果都是一致的。

在你给出的示例中,你的后端路由只更新了传入请求体(request.body)中的字段。如果 request.body 只包含 likes 字段,那么只有 likes 字段会被更新。其他字段将保持不变。

关于题目中提到的“更新时我们需要发送所有的字段,而不仅仅是要更新的字段吗?”这个问题,可能是为了强调在某些情况下,你可能需要发送所有字段。例如:

  1. 数据一致性:如果你的应用逻辑依赖于某个字段始终存在,并且不希望它被意外地删除或更改,那么你可能需要始终发送该字段,即使它的值没有变化。
  2. 前端状态管理:在某些前端框架中,发送所有字段可以确保前端的状态与后端保持一致。这可以避免因为只发送了部分字段而导致的状态不一致问题。
  3. 简化逻辑:对于一些简单的资源更新,发送所有字段可能使逻辑更简单,因为你不需要跟踪哪些字段已经更改,哪些字段需要发送。

然而,这并不是一个硬性规定。在实际应用中,你应该根据你的具体需求和应用的逻辑来决定是否需要发送所有字段。在你的情况下,如果 findByIdAndUpdate 方法只更新传入的字段,并且你通过测试验证了这一点,那么你就没有必要在每次更新时都发送所有字段。

 类似资料:
  • 您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,了解正确的语法....

  • 问题内容: 是否有更新的方式只有一些领域使用该方法的实体对象从春数据JPA? 例如,我有一个这样的JPA实体: 通过其CRUD存储库: 在Spring MVC中,我有一个控制器,该控制器获取用于更新它的对象: 我知道我可以使用来加载用户findOne,然后更改其名称并使用save…来更新它。但是,如果我有100个字段,而我想更新其中的50个字段,则更改每个值可能会很烦人。 有没有办法告诉类似“ 保

  • 有没有办法使用Spring Data JPA中的方法只更新实体对象的某些字段? 我知道我可以使用加载用户,然后更改其名称并使用更新它...但是,如果我有100个字段,我想更新其中的50个,这可能是非常恼人的更改每个值… 难道没有办法告诉像“保存对象时跳过所有空值”这样的事情吗?

  • 需要在 SQL 中将主键列更新为自动递增 我越来越不犯错, 关键字“身份”附近的语法不正确。

  • 我一直在尝试改装,我真的很简单。 然而,我有一个奥化的担忧。我正在为我的后端使用Parse,它有一个纯restapi。 当我想要更新一个对象时,我使用一个,并只在

  • 创建一个在PHP服务器端无法理解的小管理员行更新程序。我希望sql查询只更新页面上已更改的$u POST字段,这样它就不会循环所有100条左右的记录。 我的做法如下: 1) jQuery侦听已更改的输入字段,然后为已更新的用户字段分配名称属性 2) PHP检测已设置更新的用户字段。 3) 在提交重新加载时,PHP检测到该输入,并按行ID更新SQL。如何确保PHP知道哪个输入字段指向哪个行ID? j