向MongoDB文档数组添加对象:POST与PATCH哪个更合适?
向文档数组添加对象的合适HTTP请求方法
针对你向用户文档的tasks数组中添加新对象的场景,有两种符合REST语义的HTTP方法可选:
1. PATCH 方法
如果直接对用户资源进行部分更新,PATCH是最贴合的选择。它的语义就是对已有资源做局部修改,正好匹配你只修改tasks数组、不改动文档其他字段的需求。
你可以发送PATCH请求到用户资源的端点(比如/users/636e8e1dd710eed71565741c),请求体使用MongoDB的$push操作符来添加新任务:
{ "$push": { "tasks": { "name": "task2", "status": "unfinished" } } }
原用户文档结构:
{ "_id": "636e8e1dd710eed71565741c", "username": "test", "password": "$2b$10$/s9.kRYSax380Xrxf3xyVO9Z6Otc/WVx5kBSLKfu43/wYP.TSnzvW", "tasks": [{ "name": "task1", "status": "finished" }] }
修改后文档结构:
{ "_id": "636e8e1dd710eed71565741c", "username": "test", "password": "$2b$10$/s9.kRYSax380Xrxf3xyVO9Z6Otc/WVx5kBSLKfu43/wYP.TSnzvW", "tasks": [{ "name": "task1", "status": "finished" }, { "name": "task2", "status": "unfinished" }] }
2. POST 方法
如果把tasks看作用户的子资源,POST会是更清晰的选择。它的语义是向一个资源集合中创建新的子资源,这里就是向指定用户的任务集合中添加新任务。
你可以发送POST请求到子资源端点(比如/users/636e8e1dd710eed71565741c/tasks),请求体直接传递新任务对象:
{ "name": "task2", "status": "unfinished" }
不推荐使用PUT方法的原因
PUT的语义是替换整个资源,使用它需要把完整的用户文档(包括所有已有字段和tasks数组)全部发送到服务器,不仅冗余,还容易因遗漏字段导致数据丢失,完全不符合你局部修改的需求。
内容的提问来源于stack exchange,提问作者cryon234
相关产品推荐
相关产品推荐

