$setField as object expression operator

APPLIES TO: MongoDB vCore

The $setField operator is used to add, update, or remove fields in embedded documents. This operator allows for precise manipulation of document fields. This makes it useful for tasks such as updating nested fields, restructuring documents, or even removing fields entirely.

Syntax

The syntax for the $setField operator is as follows:

{
  $setField: {
    field: <fieldName>,
    input: <expression>,
    value: <expression>
  }
}
  • field: The name of the field to add, update, or remove.
  • input: The document or field being processed.
  • value: The new value to assign to the field. If value is null, the field is removed.

Examples

Example 1: Updating a nested field

Suppose you want to update the discountPercentage for the "Laptops" category in the "Summer Sale" promotion event.

db.collection.updateOne(
  { "store.storeId": "12345" },
  [{
    $set: {
      "store.promotionEvents": {
        $map: {
          input: "$store.promotionEvents",
          as: "event",
          in: {
            $setField: {
              field: "discounts",
              input: "$$event",
              value: {
                $map: {
                  input: "$$event.discounts",
                  as: "discount",
                  in: {
                    $cond: {
                      if: { $eq: ["$$discount.categoryName", "Laptops"] },
                      then: { 
                        categoryName: "$$discount.categoryName", 
                        discountPercentage: 18 
                      },
                      else: "$$discount"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }]
)

Example 2: Removing a field

Suppose you want to remove the totalStaff field from the staff object.

db.collection.updateOne(
  { "store.storeId": "12345" },
  [{
    $set: {
      "store.staff": {
        $setField: {
          field: "totalStaff",
          input: "$store.staff",
          value: null
        }
      }
    }
  }]
)