$unset (字段更新运算符)

适用对象: 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字段。

单个作中可以取消设置多个字段。