Skip to content

Commit dcb0dd8

Browse files
author
CodeBuddy Attribution Bot
committed
fix(attribution): writeNoSqlDatabaseContent 对嵌套对象更新缺乏明确的行为说明,导致模型误用 $set 覆盖整个嵌套对象 (issue_mojxks03_yvtgc5)
1 parent 6eaebcb commit dcb0dd8

1 file changed

Lines changed: 2 additions & 2 deletions

File tree

mcp/src/tools/databaseNoSQL.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -773,7 +773,7 @@ deleteCollection: 删除集合`),
773773
{
774774
title: "修改 NoSQL 数据库数据记录",
775775
description:
776-
"修改 NoSQL 数据库数据记录。⚠️ 本工具为服务端管理工具,用于管理端/运维端操作(如后台脚本、数据迁移、批量修改)。当任务要求编写客户端应用代码时(例如「用 JS SDK 登录并插入数据」、「在前端读写数据库」),不应使用本工具,而应在项目代码中编写 @cloudbase/js-sdk 客户端代码(如 app.database().collection().add()、db.collection().where().get() 等)。可按 MongoDB updateOne/updateMany 的心智模型理解:部分更新必须使用 `$set`、`$inc`、`$push` 等更新操作符;如果直接传「字段到值的普通对象」这类内容,底层会把它当作替换内容,存在覆盖整条文档的风险。更新嵌套对象中的某个字段时必须使用点号路径,例如把 `address.city` 设为 `shenzhen`;如果把整个 `address` 对象作为 `$set` 的值传入,则整个 `address` 对象会被替换,同级其他字段将丢失。若集合中的角色/档案文档会在前端通过 `db.collection(...).doc(uid)` 读取,请确保文档 `_id` 就是该 `uid`;不要用按 `uid` 条件查询再配合 `upsert=true` 的方式去更新 `users` / `profiles`,否则经常会生成一个不同的 `_id`,导致后续 `doc(uid)` 读取命中不到。",
776+
"修改 NoSQL 数据库数据记录。⚠️ 本工具为服务端管理工具,用于管理端/运维端操作(如后台脚本、数据迁移、批量修改)。当任务要求编写客户端应用代码时(例如「用 JS SDK 登录并插入数据」、「在前端读写数据库」),不应使用本工具,而应在项目代码中编写 @cloudbase/js-sdk 客户端代码(如 app.database().collection().add()、db.collection().where().get() 等)。可按 MongoDB updateOne/updateMany 的心智模型理解:部分更新必须使用 `$set`、`$inc`、`$push` 等更新操作符;如果直接传「字段到值的普通对象」这类内容,底层会把它当作替换内容,存在覆盖整条文档的风险。**⚠️ 嵌套对象局部更新必须使用点号路径**:当用户说「把 shipping 更新为 {city: \"guangzhou\"}」时,如果 shipping 原本是 {city: \"beijing\", province: \"hebei\"},正确的做法是 `$set: {\"shipping.city\": \"guangzhou\"}`,错误的做法是 `$set: {shipping: {city: \"guangzhou\"}}`(会删除 province 字段)。同样,更新 `address.city` 时应使用 `{ \"$set\": { \"address.city\": \"shenzhen\" } }` 而非替换整个 address 对象。若集合中的角色/档案文档会在前端通过 `db.collection(...).doc(uid)` 读取,请确保文档 `_id` 就是该 `uid`;不要用按 `uid` 条件查询再配合 `upsert=true` 的方式去更新 `users` / `profiles`,否则经常会生成一个不同的 `_id`,导致后续 `doc(uid)` 读取命中不到。",
777777
inputSchema: {
778778
action: z
779779
.enum(["insert", "update", "delete"])
@@ -797,7 +797,7 @@ deleteCollection: 删除集合`),
797797
.union([z.object({}).passthrough(), z.string()])
798798
.optional()
799799
.describe(
800-
"更新内容(对象或字符串,推荐对象)(update 操作必填)。按 MongoDB 更新语义传入 MgoUpdate:部分更新请使用 `$set`、`$inc`、`$unset`、`$push` 等操作符,例如使用 `$set` 更新 `status`;不要直接传“字段到值的普通对象”,否则可能替换整条文档。更新嵌套字段时必须使用点号路径,例如通过 `$set` 更新 `address.city`;不要把整个 `address` 对象作为 `$set` 的值传入,否则会替换整个 `address` 对象。",
800+
"更新内容(对象或字符串,推荐对象)(update 操作必填)。按 MongoDB 更新语义传入 MgoUpdate:部分更新请使用 `$set`、`$inc`、`$unset`、`$push` 等操作符,例如使用 `$set` 更新 `status`。**⚠️ 嵌套字段更新必须使用点号路径**:`$set: {\"address.city\": \"shenzhen\"}` 只更新 `address.city`,保留其他字段;`$set: {address: {city: \"shenzhen\"}}` 会替换整个 address 对象,删除其他字段。当用户说「把 X 更新为 {Y: Z}」时,应理解为「更新 X.Y 为 Z」,使用点号路径而非替换整个对象。",
801801
),
802802
isMulti: z
803803
.boolean()

0 commit comments

Comments
 (0)