对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

$setField(表达式操作符)

$setField

版本 5.0 中的新增功能。

添加、更新或删除文档中的指定字段。

您可以使用$setField添加、更新或删除名称包含句点 ( . ) 或以美元符号 ( $ ) 开头的字段。

请勿依赖与保留的内部元数据字段名称冲突的根级前缀为美元的字段名称,因为在某些查询处理上下文中,这些字段可能会被删除或无法访问。有关包含美元符 ($)或句号 (.)的字段名称的限制和指导,请参阅带有句号和美元符的字段名称。

提示

使用 $getField 检索包含美元符号($)或句点(.)的字段值,您可以使用 $setField 添加或更新这些字段。

$setField 通过以下语法实现:

{ $setField: { field: <String>, input: <Object>, value: <Expression> }}

您必须提供以下字段:

字段
类型
说明

field

字符串

您要添加、更新或删除的 input 对象中的字段。field 可以是解析为字符串常量的任何有效表达式。

input

对象

一份文档,包含您要添加或更新的 field。inputmissing 必须解析为对象、null、或 undefined。

value

表达式(expression)

要分配给 field 的值。value 可以是任何有效表达式。

设为 $$REMOVE 可从 input 文档中删除 field。

  • 如果 input 的计算结果为 missing、undefined 或 null,$setField 返会回 null,而不更新 input。

  • 如果 input 的计算结果为对象、missing、undefined 或 null 以外的任何值,$setField 将返回错误。

  • 如果 field 的解析结果不是字符串常量,$setField 将返回错误。

  • 如果 input 中不存在 field,$setField 会进行添加。

  • $setField 不会隐式遍历对象或数组。例如,$setField 将 "a.b.c" 的 field 值计算为顶级字段 "a.b.c",而不是嵌套字段 { "a": { "b": { "c": } } }。

  • $unsetField 是输入值为 $$REMOVE 的 $setField 的别名。以下表达式具有同等效果:

    { $setField: { field: <field name>, input: “$$ROOT”, value: "$$REMOVE" }} { $unsetField: { field: <field name>, input: “$$ROOT” }}

考虑包含以下文档的 inventory 集合:

db.inventory.insertMany( [ { _id: 1, item: "sweatshirt", price: 45.99, qty: 300 }, { _id: 2, item: "winter coat", price: 499.99, qty: 200 }, { _id: 3, item: "sun dress", price: 199.99, qty: 250 }, { _id: 4, item: "leather boots", price: 249.99, qty: 300 }, { _id: 5, item: "bow tie", price: 9.99, qty: 180 }] )

以下操作使用 $replaceWith 管道阶段和 $setField 操作符为每份文档添加一个新字段 "price.usd"。每份文档中 "price.usd" 的值等于 "price" 的值。最后,该操作使用 $unset 管道阶段删除 "price" 字段。

db.inventory.aggregate( [ { $replaceWith: { $setField: { field: "price.usd", input: "$$ROOT", value: "$price" } } }, { $unset: "price" }] )

操作返回以下结果:

[ { _id: 1, item: 'sweatshirt', qty: 300, 'price.usd': 45.99 }, { _id: 2, item: 'winter coat', qty: 200, 'price.usd': 499.99 }, { _id: 3, item: 'sun dress', qty: 250, 'price.usd': 199.99 }, { _id: 4, item: 'leather boots', qty: 300, 'price.usd': 249.99 }, { _id: 5, item: 'bow tie', qty: 180, 'price.usd': 9.99 }]

考虑包含以下文档的 inventory 集合:

db.inventory.insertMany( [ { _id: 1, item: "sweatshirt", price: 45.99, qty: 300 }, { _id: 2, item: "winter coat", price: 499.99, qty: 200 }, { _id: 3, item: "sun dress", price: 199.99, qty: 250 }, { _id: 4, item: "leather boots", price: 249.99, qty: 300 }, { _id: 5, item: "bow tie", price: 9.99, qty: 180 }] )

以下操作使用 $replaceWith 管道阶段以及 $setField 和 $literal 操作符为每个文档添加一个新字段 "$price"。"$price" 的值等于 "price" 的值,在每个文档中。最后,该操作使用 $unset 管道阶段删除 "price" 字段。

db.inventory.aggregate( [ { $replaceWith: { $setField: { field: { $literal: "$price" }, input: "$$ROOT", value: "$price" } } }, { $unset: "price" }] )

操作返回以下结果:

[ { _id: 1, item: 'sweatshirt', qty: 300, '$price': 45.99 }, { _id: 2, item: 'winter coat', qty: 200, '$price': 499.99 }, { _id: 3, item: 'sun dress', qty: 250, '$price': 199.99 }, { _id: 4, item: 'leather boots', qty: 300, '$price': 249.99 }, { _id: 5, item: 'bow tie', qty: 180, '$price': 9.99 }]

考虑包含以下文档的 inventory 集合:

db.inventory.insertMany( [ { _id: 1, item: 'sweatshirt', qty: 300, 'price.usd': 45.99 }, { _id: 2, item: 'winter coat', qty: 200, 'price.usd': 499.99 }, { _id: 3, item: 'sun dress', qty: 250, 'price.usd': 199.99 }, { _id: 4, item: 'leather boots', qty: 300, 'price.usd': 249.99 }, { _id: 5, item: 'bow tie', qty: 180, 'price.usd': 9.99 }] )

以下操作使用 $match 管道阶段查找特定文档,并使用 $replaceWith 管道阶段以及 $setField 操作符更新匹配文档中的 "price.usd" 字段:

db.inventory.aggregate( [ { $match: { _id: 1 } }, { $replaceWith: { $setField: { field: "price.usd", input: "$$ROOT", value: 49.99 } } }] )

操作返回以下结果:

[ { _id: 1, item: 'sweatshirt', qty: 300, 'price.usd': 49.99 }]

考虑包含以下文档的 inventory 集合:

db.inventory.insertMany([ { _id: 1, item: 'sweatshirt', qty: 300, '$price': 45.99 }, { _id: 2, item: 'winter coat', qty: 200, '$price': 499.99 }, { _id: 3, item: 'sun dress', qty: 250, '$price': 199.99 }, { _id: 4, item: 'leather boots', qty: 300, '$price': 249.99 }, { _id: 5, item: 'bow tie', qty: 180, '$price': 9.99 }] )

以下操作使用 $match 管道阶段查找特定文档,使用 $replaceWith 管道阶段以及 $setField 和 $literal 操作符更新匹配文档中的 "$price" 字段:

db.inventory.aggregate( [ { $match: { _id: 1 } }, { $replaceWith: { $setField: { field: { $literal: "$price" }, input: "$$ROOT", value: 49.99 } } }] )

操作返回以下结果:

[ { _id: 1, item: 'sweatshirt', qty: 300, '$price': 49.99 }]

考虑包含以下文档的 inventory 集合:

db.inventory.insertMany([ { _id: 1, item: 'sweatshirt', qty: 300, 'price.usd': 45.99 }, { _id: 2, item: 'winter coat', qty: 200, 'price.usd': 499.99 }, { _id: 3, item: 'sun dress', qty: 250, 'price.usd': 199.99 }, { _id: 4, item: 'leather boots', qty: 300, 'price.usd': 249.99 }, { _id: 5, item: 'bow tie', qty: 180, 'price.usd': 9.99 }] )

以下操作使用 $replaceWith 管道阶段、$setField 操作符和 $$REMOVE 从每个文档中删除 "price.usd" 字段:

db.inventory.aggregate( [ { $replaceWith: { $setField: { field: "price.usd", input: "$$ROOT", value: "$$REMOVE" } } }] )

操作返回以下结果:

[ { _id: 1, item: 'sweatshirt', qty: 300 }, { _id: 2, item: 'winter coat', qty: 200 }, { _id: 3, item: 'sun dress', qty: 250 }, { _id: 4, item: 'leather boots', qty: 300 }, { _id: 5, item: 'bow tie', qty: 180 }]

使用 $unsetField 别名写入的类似查询会返回相同的结果:

db.inventory.aggregate( [ { $replaceWith: { $unsetField: { field: "price.usd", input: "$$ROOT" } } }] )

考虑包含以下文档的 inventory 集合:

db.inventory.insertMany( [ { _id: 1, item: 'sweatshirt', qty: 300, '$price': 45.99 }, { _id: 2, item: 'winter coat', qty: 200, '$price': 499.99 }, { _id: 3, item: 'sun dress', qty: 250, '$price': 199.99 }, { _id: 4, item: 'leather boots', qty: 300, '$price': 249.99 }, { _id: 5, item: 'bow tie', qty: 180, '$price': 9.99 }] )

以下操作使用 $replaceWith 管道阶段、$setField 和 $literal 操作符以及 $$REMOVE 从每份文档中删除 "$price" 字段:

db.inventory.aggregate( [ { $replaceWith: { $setField: { field: { $literal: "$price" }, input: "$$ROOT", value: "$$REMOVE" } } }] )

操作返回以下结果:

[ { _id: 1, item: 'sweatshirt', qty: 300 }, { _id: 2, item: 'winter coat', qty: 200 }, { _id: 3, item: 'sun dress', qty: 250 }, { _id: 4, item: 'leather boots', qty: 300 }, { _id: 5, item: 'bow tie', qty: 180 }]

使用 $unsetField 别名写入的类似查询会返回相同的结果:

db.inventory.aggregate( [ { $replaceWith: { $unsetField: { field: { $literal: "$price" }, input: "$$ROOT" } } }] )
给本页内容打分