定义
$setField版本 5.0 中的新增功能。
添加、更新或删除文档中的指定字段。
您可以使用
$setField添加、更新或删除名称包含句点.() 或以美元符号 ()$开头的字段。请勿依赖与保留的内部元数据字段名称冲突的根级前缀为美元的字段名称,因为在某些查询处理上下文中,这些字段可能会被删除或无法访问。有关包含美元符 (
$)或句号 (.)的字段名称的限制和指导,请参阅带有句号和美元符的字段名称。提示
$getField使用 检索您使用$.添加或更新的包含美元符号 () 或句点 ()$setField的字段的值。
语法
$setField 通过以下语法实现:
{ $setField: { field: <String>, input: <Object>, value: <Expression> } }
您必须提供以下字段:
行为
inputmissingundefined如果null的计算结果为 、 或$setField, 将返回null并且不会更新input。input如果missing的计算结果为对象、undefined、 或null以外的任何值,$setField将返回错误。如果
field解析为字符串常量以外的任何值,则$setField将返回错误。如果
field中不存在input,$setField则会进行添加。$unsetField是输入值为$setField的$$REMOVE的别名。以下表达式是等效的:{ $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" } } } ] )