Haven't started scoping yet but suspect this will need drivers changes.
Description of Linked Ticket
Summary
Allow updateOne (i.e. update with multi:false), deleteOne (i.e delete with limit:1), and findAndModify without a shard key or _id equality in their filter to work against a sharded collection, supporting all options.
Motivation
The current implementation of updateOne, deleteOne, and findAndModify against a sharded collection requires that the request can be unequivocally routed to a single shard (i.e. the shard key must be in the filter) or, for updateOne and deleteOne, that the document to be modified can be uniquely identified through its _id. If these requirements are not satisfied, these writes fail, which makes the presence of sharding underneath more apparent and prevents automatically sharding a user’s collection, which is at odds with the long term vision for serverless MongoDB.
Documentation
Summary
This project proposes making updateMany, without a shard key in the filter, work correctly against a sharded collection, for all combinations of ordered:true/false and upsert:true/false. We will consider several ways to implement this - using transactions against all concurrently targeted shards or using two-phase updates where the first phase establishes cursors and the second phase performs the actual updates.
Motivation
The current implementation of updateMany against a sharded collection doesn’t work correctly, because it doesn’t synchronise with chunk migrations and doesn’t perform chunk filtering. As a result, it has the potential of applying updates to the same document between zero and multiple times. Furthermore, it the upsert:true option requires that a shard key be specified so that a unique shard can be targeted.
Documentation
- is related to
-
MONGOID-4759 Change updates to prefer target by the query
- Backlog
- related to
-
DRIVERS-818 updateMany without shard key
- Development Complete
- links to