更新时我们需要发送所有的字段,而不仅仅是要更新的字段吗?
在做fullstackopen的练习的时候,对这个题目描述不解?当我们只需更新likes
字段,需要将其他的字段信息也放到请求中吗?
对这个项目做一个简短的介绍
使用到的一些技术: mongodb
、react
、axios
(用于前端和后端通信)、express
、restful
后端相关的操作如下所示
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
字段,其他保持不变。博客的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);
(脑子一时锈掉了)后端操作要提取出博客的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(); }});
在 RESTful API 设计中,通常,当你要更新一个资源时,你只需要发送需要更新的字段。这是因为 HTTP PUT 方法是幂等的,意味着多次执行相同的请求应该产生相同的结果。如果你只发送需要更新的字段,那么无论请求被发送多少次,结果都是一致的。
在你给出的示例中,你的后端路由只更新了传入请求体(request.body
)中的字段。如果 request.body
只包含 likes
字段,那么只有 likes
字段会被更新。其他字段将保持不变。
关于题目中提到的“更新时我们需要发送所有的字段,而不仅仅是要更新的字段吗?”这个问题,可能是为了强调在某些情况下,你可能需要发送所有字段。例如:
然而,这并不是一个硬性规定。在实际应用中,你应该根据你的具体需求和应用的逻辑来决定是否需要发送所有字段。在你的情况下,如果 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