包含周期的字段名称
本节总结如何插入、查询和更新包含周期字段名称的文档。
在字段名称中添加句点
要插入包含字段名称且带有句点的文档,请将字段名称放在引号中。
以下命令插入包含字段名称的文档price.usd
:
db.inventory.insertOne( { "item" : "sweatshirt", "price.usd": 45.99, "quantity": 20 } )
查询带有句点的字段
要查询带有句点的字段,使用$getField
运算符。
以下查询返回price.usd
字段大于40
的文档
db.inventory.find( { $expr: { $gt: [ { $getField: "price.usd" }, 40 ] } } )
[ { _id: ObjectId("66145f9bcb1d4abffd2f1b50"), item: 'sweatshirt', 'price.usd': 45.99, quantity: 20 } ]
如果您不使用$getField
,MongoDB将带有句点的字段名称视为内嵌对象。例如,以下查询匹配price
字段内的usd
字段大于40
的文档
db.inventory.find( { "price.usd": { $gt: 40 } } )
前面的查询会匹配此文档
{ "item" : "sweatshirt", "price": { "usd": 45.99 }, "quantity": 20 }
更新带有周期的字段
要更新一个带有周期的字段,请使用包含 $setField
操作符的聚合管道。
以下操作将 price.usd
字段设置为 29.99
db.inventory.updateOne( { "item": "sweatshirt" }, [ { $replaceWith: { $setField: { field: "price.usd", input: "$$ROOT", value: 29.99 } } } ] )
如果不使用 $setField
,MongoDB 会将带有周期的字段名视为内嵌对象。例如,以下操作不会更新现有的 price.usd
字段,而是插入一个新的字段 usd
,它嵌套在 price
字段内部
db.inventory.updateOne( { "item": "sweatshirt" }, { $set: { "price.usd": 29.99 } } )
结果文档
[ { _id: ObjectId("66145f9bcb1d4abffd2f1b50"), item: 'sweatshirt', 'price.usd': 45.99 quantity: 20, price: { usd: 29.99 } } ]
有关使用聚合管道更新示例的更多信息,请参阅 使用聚合管道更新。