On this page
updateZoneKeyRange
On this page
Definition
updateZoneKeyRange-
New in version 3.4.
The
updateZoneKeyRangeadministrative command can either create or remove the association between a range of shard key values and a zone.To run
updateZoneKeyRange, use thedb.runCommand( { <command> } )method.You must run
addShardToZoneon the admin database.The
updateZoneKeyRangecommand has the following syntax:{ updateZoneKeyRange: <string>, min: <document>, max: <document> zone: <string> | <null> }The command takes the following fields:
Parameter Type Description updateZoneKeyRangestring The namespace of the collection to associate with the range.
The collection must be sharded for the command to succeed.
mindocument The inclusive lower bound of the range of shard key values.
Specify each field of the shard key in the form of
<fieldname> : <value>. The value must be of the same BSON type or types as the shard key.maxdocument The exclusive upper bound of the range of shard key values.
Specify each field of the shard key in the form of
<fieldname> : <value>. The value must be of the same BSON type or types as the shard key.zonestring The name of the zone to associate with the range bounded by the
minandmax.If the value does not match an existing zone, the command fails.
Specify
nullto remove the association between the range with lower bounds ofminand upper bound ofmaxand theupdateZoneKeyRangecollection. The values ofminandmaxmust match exactly the target range.If no zone range matches the minimum and maximum bounds passed to
updateZoneKeyRange, nothing is removed.Only issue
updateZoneKeyRangewhen connected to amongosinstance.The
mongoshell provides two helper methods:sh.updateZoneKeyRange()for adding a range of shard key values to a zone.sh.removeRangeFromZone()for removing a range of shard key values from a zone.
Behavior
You cannot create a range of shard key values whose lower and upper boundaries overlap with an existing range for the sharded collection. For example, given an existing range of 1 to 10, you cannot create a new range of 5 to 20, as the new range would overlap with the existing range.
A zone can have multiple ranges of data associated with it, but a range can at most be associated with a single zone.
When removing the association between a range and a zone, updateZoneKeyRange does not remove the zone. Use the removeShardFromZone command to remove the association between a zone and a shard.
See the zone manual page for more information on zones in sharded clusters.
Balancer
After successfully running updateZoneKeyRange, there may be chunk migrations during the next balancer round.
After adding a range to a zone, the balancer must first run in order to migrate any chunks whose ranges are covered by the zone to shards inside of that zone. Until balancing completes, some chunks may reside on the wrong shard given the configured zones for the sharded cluster.
Removing the association between a range and a zone removes the constraints keeping chunks covered by the range on the shards inside that zone. During the next balancer round, the balancer may migrate chunks that were previously covered by the zone.
See the documentation for the sharded cluster balancer for more information on how migrations work in a sharded cluster.
Dropped Collections
If you add a zone range associated to a sharded collection using updateZoneKeyRange and then later drop the collection or its database, MongoDB does not remove the range association. If you later create a new collection with the same name, the old range association applies to the new collection.
Security
For sharded clusters running with authentication, you must authenticate as either:
a user whose privileges include the specified actions on various collections in the
configdatabase:or, alternatively,
a user whose privileges include
enableShardingon the cluster resource (available starting in version 3.6.16).
The clusterAdmin or clusterManager built-in roles have the appropriate permissions for issuing updateZoneKeyRange. See the documentation page for Role-Based Access Control for more information.
Example
Given a sharded collection exampledb.collection with a shard key of { a : 1 }, the following operation creates a range with a lower bound of 1 and an upper bound of 10 on the alpha zone:
admin = db.getSiblingDB("admin")
admin.runCommand(
{
updateZoneKeyRange : "exampledb.collection",
min : { a : 1 },
max : { a : 10 },
zone : "alpha"
}
)
The following operation removes the previously created range by passing null to the zone field.
admin = db.getSiblingDB("admin")
admin.runCommand(
{
updateZoneKeyRange : "exampledb.collection",
min : { a : 1 },
max : { a : 10 },
zone : null
}
)
The min and max must match exactly the bounds of the target range. The following operation attempts to remove the previously created range, but specifies { a : 0 } as the min bound:
admin = db.getSiblingDB("admin")
admin.runCommand(
{
updateZoneKeyRange : "exampledb.collection",
min : { a : 0 },
max : { a : 10 },
zone : null
}
)
While the range of { a : 0 } and { a : 10 } encompasses the existing range, it is not an exact match and therefore updateZoneKeyRange does not remove anything.
Compound Shard Key
Given a sharded collection exampledb.collection with a shard key of { a : 1, b : 1 }, the following operation creates a range covering the lower bound of { a: 1, b : 1 } and an upper bound of { a : 10, b : 10} and associates it with the alpha zone:
admin = db.getSiblingDB("admin")
admin.runCommand(
{
updateZoneKeyRange : "exampledb.collection",
min : { a : 1, b : 1 },
max : { a : 10, b : 10 },
zone : "alpha"
}
)