FEATURE DESCRIPTION
MongoDB 3.5.12 extends all update modifiers to apply to all array elements or all array elements that match a predicate, specified in a new update option arrayFilters. This syntax also supports nested array elements.
VERSIONS
This new feature is available starting with the MongoDB 3.5.12 development version, and included in the MongoDB 3.6 production version.
OPERATION
Update all documents in array
db.coll.update({}, {$set: {“a.$[].b”: 2}}) Input: {a: [{b: 0}, {b: 1}]} Output: {a: [{b: 2}, {b: 2}]}
Update all matching documents in array
db.coll.update({}, {$set: {“a.$[i].b”: 2}}, {arrayFilters: [{“i.b”: 0}]}) Input: {a: [{b: 0}, {b: 1}]} Output: {a: [{b: 2}, {b: 1}]}
Update all matching scalars in array
db.coll.update({}, {$set: {“a.$[i]”: 2}}, {arrayFilters: [{i: 0}]}) Input: {a: [0, 1]} Output: {a: [2, 1]}
Update all matching documents in nested array
db.coll.update({}, {$set: {“a.$[i].c.$[j].d”: 2}}, {arrayFilters: [{“i.b”: 0}, {“j.d”: 0}]}) Input: {a: [{b: 0, c: [{d: 0}, {d: 1}]}, {b: 1, c: [{d: 0}, {d: 1}]}]} Output: {a: [{b: 0, c: [{d: 2}, {d: 1}]}, {b: 1, c: [{d: 0}, {d: 1}]}]}
Update all scalars in array matching a logical predicate
db.coll.update({}, {$set: {“a.$[i]”: 2}}, {arrayFilters: [{$or: [{i: 0}, {i: 3}]}]}) Input: {a: [0, 1, 3]} Output: {a: [2, 1, 2]}
Each array filter must be a predicate over a document with a single field name. Each array filter must be used in the update expression, and each array filter identifier $[<id>] must have a corresponding array filter. <id> must begin with a lowercase letter and not contain any special characters. There must not be two array filters with the same field name.
IMPLEMENTATION DETAILS
The implementation of this feature involved a rewrite of the update system. Users can find all the related tickets here. The design document is attached.
Original description
- depends on
-
SERVER-27089 Extend the update subsystem to support more expressive updates to array fields
- Closed
-
SERVER-6399 Refactor update() code
- Closed
- is depended on by
-
SERVER-828 Support for selecting array elements in return specifier (projection)
- Closed
-
SERVER-3089 Ability to make use of a subdocument's data whose contents were used to satisfy a query using the $ operator
- Closed
- is duplicated by
-
SERVER-9726 cant append for subdocument level 2
- Closed
-
SERVER-14281 Positional Operator Points to Wrong Index in $set Update
- Closed
-
SERVER-11696 Updates not working at : Nested level of Array (no syntax available)
- Closed
-
SERVER-14164 MongoDB: Too many positional (i.e. '$') elements found in path
- Closed
-
SERVER-13929 Multi $(update) use or update in aggregation pipeline
- Closed
- is related to
-
SERVER-6864 positional operator projection inclusion can mess up array based non positional operator
- Closed