适用对象:
MongoDB vCore
运算符 $unset
用于在更新作期间从文档中删除指定的字段。 无论文档的当前值如何,此运算符都会完全删除文档中的字段。 它可用于清理文档架构、删除已弃用的字段或消除文档中不必要的数据。
语法
$unset
运算符的语法如下:
{
$unset: {
<field1>: "",
<field2>: "",
...
}
}
参数
DESCRIPTION | |
---|---|
field |
要删除的字段的名称。 可以是顶级字段,也可以对嵌套字段使用点表示法。 |
value |
该值通常是空字符串(“”),但可以是任何值。 忽略实际值;仅字段名称很重要。 |
示例:
让我们了解 stores
数据集中的示例 json 的用法。
{
"_id": "e6895a31-a5cd-4103-8889-3b95a864e5a6",
"name": "VanArsdel, Ltd. | Picture Frame Store - Port Clevelandton",
"location": {
"lat": 16.8331,
"lon": -141.9922
},
"staff": {
"totalStaff": {
"fullTime": 6,
"partTime": 8
}
},
"sales": {
"totalSales": 17676,
"salesByCategory": [
{
"categoryName": "Photo Albums",
"totalSales": 17676
}
]
},
"temporaryField": "This should be removed",
"outdatedInfo": {
"oldSystem": true,
"legacyData": "deprecated"
}
}
示例 1:删除顶级字段
假设你想要从存储文档中删除临时或过时的字段。
db.stores.updateOne(
{ "_id": "e6895a31-a5cd-4103-8889-3b95a864e5a6" },
{
$unset: {
"temporaryField": "",
"outdatedInfo": ""
}
}
)
上述作后,文档将按如下所示进行更新:
{
"_id": "e6895a31-a5cd-4103-8889-3b95a864e5a6",
"name": "VanArsdel, Ltd. | Picture Frame Store - Port Clevelandton",
"location": {
"lat": 16.8331,
"lon": -141.9922
},
"staff": {
"totalStaff": {
"fullTime": 6,
"partTime": 8
}
},
"sales": {
"totalSales": 17676,
"salesByCategory": [
{
"categoryName": "Photo Albums",
"totalSales": 17676
}
]
}
}
示例 2:删除嵌套字段
可以使用点表示法删除特定的嵌套字段。
db.stores.updateOne(
{ "_id": "e6895a31-a5cd-4103-8889-3b95a864e5a6" },
{
$unset: {
"location": "",
"staff.totalStaff.partTime": ""
}
}
)
上述作后,文档将按如下所示进行更新:
{
"_id": "e6895a31-a5cd-4103-8889-3b95a864e5a6",
"name": "VanArsdel, Ltd. | Picture Frame Store - Port Clevelandton",
"location": {
"lat": 16.8331
},
"staff": {
"totalStaff": {
"fullTime": 6
}
},
"sales": {
"totalSales": 17676,
"salesByCategory": [
{
"categoryName": "Photo Albums",
"totalSales": 17676
}
]
}
}
示例 3:删除数组元素
与数组元素一起使用 $unset
时,它将元素 null
设置为而不是完全删除它。
// Assuming we have a store with multiple sales categories
db.stores.updateOne(
{ "_id": "40d6f4d7-50cd-4929-9a07-0a7a133c2e74" },
{
$unset: {
"sales.salesByCategory.1": ""
}
}
)
这会将 salesByCategory 数组的第二个元素(索引 1)设置为 null
:
{
"_id": "40d6f4d7-50cd-4929-9a07-0a7a133c2e74",
"sales": {
"totalSales": 151864,
"salesByCategory": [
{
"categoryName": "Sound Bars",
"totalSales": 2120
},
null,
{
"categoryName": "Game Controllers",
"totalSales": 43522
}
]
}
}
示例 4:批量取消设置作
可以使用 中删除字段。
// Remove deprecated fields from all stores
db.stores.updateMany(
{},
{
$unset: {
"legacyField": "",
"deprecatedStatus": "",
"oldVersion": ""
}
}
)
示例 5:条件字段删除
可以将查询条件与查询条件结合使用 $unset
,以便有选择地删除字段。
// Remove specific fields from stores with low sales
db.stores.updateMany(
{ "sales.totalSales": { $lt: 50000 } },
{
$unset: {
"premiumFeatures": "",
"vipCustomerList": "",
"exclusiveOffers": ""
}
}
)
示例 6:将$unset与其他运算符配合使用
可以在单个作中与其他更新运算符结合使用 $unset
。
db.stores.updateOne(
{ "_id": "26afb024-53c7-4e94-988c-5eede72277d5" },
{
$set: {
"status": "updated",
"lastModified": new Date()
},
$unset: {
"temporaryData": "",
"processingFlag": ""
}
}
)
重要
如果指定的 $unset
字段不存在,则作对该字段没有影响。
忽略中指定的 $unset
值;可以使用任何值,但约定是使用空字符串(“)。
与数组元素一起使用时, $unset
将数组元素 null
设置为而不是完全删除它。
若要完全删除数组元素,请使用类似 $pull
或 $pop
改用运算符。
$unset
该运算符不能用于删除_id
字段。
单个作中可以取消设置多个字段。