Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions mcp/src/tools/databaseNoSQL.ts
Original file line number Diff line number Diff line change
Expand Up @@ -773,7 +773,7 @@ deleteCollection: 删除集合`),
{
title: "修改 NoSQL 数据库数据记录",
description:
"修改 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)` 读取命中不到。",
"修改 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)` 读取命中不到。",
inputSchema: {
action: z
.enum(["insert", "update", "delete"])
Expand All @@ -797,7 +797,7 @@ deleteCollection: 删除集合`),
.union([z.object({}).passthrough(), z.string()])
.optional()
.describe(
"更新内容(对象或字符串,推荐对象)(update 操作必填)。按 MongoDB 更新语义传入 MgoUpdate:部分更新请使用 `$set`、`$inc`、`$unset`、`$push` 等操作符,例如使用 `$set` 更新 `status`;不要直接传“字段到值的普通对象”,否则可能替换整条文档。更新嵌套字段时必须使用点号路径,例如通过 `$set` 更新 `address.city`;不要把整个 `address` 对象作为 `$set` 的值传入,否则会替换整个 `address` 对象。",
"更新内容(对象或字符串,推荐对象)(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」,使用点号路径而非替换整个对象。",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve explicit full-object replacement intent

The new instruction in writeNoSqlDatabaseContent overgeneralizes nested updates by saying 把 X 更新为 {Y: Z} should be interpreted as 更新 X.Y 为 Z, which forces dot-notation even when a user explicitly intends to replace the whole nested object (for example, intentionally dropping sibling keys like province). In those cases the tool guidance now steers the model toward partial updates and can silently keep stale fields, producing incorrect persisted data relative to the user’s request.

Useful? React with 👍 / 👎.

),
isMulti: z
.boolean()
Expand Down
Loading