The Details
If you are inserting a document lacking a _id key, the server generates a value. The _id is 32 bits of a unique prefix (4 bytes), a time stamp (8 bytes), and serial number (16 bytes). The prefix is assigned by the InnoDB Cluster to help ensure uniqueness across a cluster. The timestamp is the encoded startup time of the server. The serial numbers uses the auto increment offset and auto increment increment server variables . From the manual page:This document ID format ensures that:The primary key value monotonically increments for inserts originating from a single server instance, although the interval between values is not uniform within a table.When using multi-primary Group Replication or InnoDB cluster, inserts to the same table from different instances do not have conflicting primary key values; assuming that the instances have the auto_increment_* system variables configured properly.
Properties
Once set, the _id can not be set to another value. Inserting your own value overrides the server assignment. And if you attempt to insert a document with the same _id you the server will generate a duplicate primary key error.The _id values must be always increasing and sequential for optimal InnoDB performance. The server will keep track of theses numbers across restarts.
The generated _id values for each table/collection are unique across instances to avoid primary key conflicts and minimize transaction certification in multi-primary Group Replication or InnoDB cluster environments.
Required?
So, you are adding a document to a collection and you get an ERROR: 5115! That means in the following cast that the _id key/value pair is needed:JS> db.foobar.add( -> { -> Data: "This is a test!" -> } -> ) -> ERROR: 5115: Document is missing a required field JS> db.foobar.add(
{ Data: "This is a test!" ,
-> _id: "first"
}
) Query OK, 1 item affected (0.0076 sec)