MongoDB ObjectIds

From mi-linux
Jump to navigationJump to search

Main Page >> MongoDB >>MongoDB Workbook >> Object IDs

Object IDs

You may have noticed that the database creates an unique object for each document:

db.deptCollection.find().pretty()

Examine the output carefully and you will notice for each department in the collection something like:

"_id" : ObjectId("5808e3d2ec0ff55100af2649")

An ObjectId is like a primary key found in relational databases, except in this case it is globally unique across the whole database, not just one table. It is similar to objectIds found in object-oriented programming languages.

ObjectIds created by MongoDB are a 12-byte BSON type, with the following structure:

ObjectID layout
0 1 2 3 4 5 6 7 8 9 10 11
time machine pid inc

Where:

  • time: timestamp - the time in seconds
  • machine: machine identifier
  • pid: process identifier
  • inc: auto-incrementing counter

Adding ObjectIds

You can assign an objectId yourself to a document, but you do need to ensure it will be globally unique, so treating it as a primary key is not a good idea. Alternatively, you can use the ObjectId() function to add one.

The following examples creates a new projectCollection, with two projects:

db.projCollection.insert( 
{ _id: 10,
  projno: 110, 
  proj_name: 'Oracle Project',
  budget: 10000,
  }
 )
 
db.projCollection.insert(
{ _id: 20,
  projno: 120, 
  proj_name: 'MongoDB Project',
  budget: 20000,
  }  
)

If you try and reuse the same objectId:

db.projCollection.insert( 
{ _id: 10,
  projno: 210, 
  proj_name: 'Other Oracle Project',
  budget: 10000,
  }
 )

You will get a E11000 duplicate key error collection error message.

This is because user generated _ids must be unique within the collection. If you want to reference the _id outside the collection, you need to use a system generated id:

 db.projCollection.insert(  {
  projno: 140, 
  proj_name: 'ObjectId Project',
  budget: 25000,
 } )

By not defining the _id, the system will generate one automatically.

Check what _id the project has:

db.projCollection.find({projno: 140  }).pretty()

Then add a new department using this id for a project field:

db.deptCollection.insert(

{
  deptno: 70,
  dname: 'OBJECT Test',
  loc: 'STOCKPORT',
  employees: [ {
     empno: 81999,
     ename: 'Perry',
     project:  ObjectId("your_project_id")
     } ]
  }
)

Where you need to replace your_project_id with the _id of the project above, for example: 580a8701105d532281cdd3aa"

Querying with ObjectIds

db.deptCollection.find({ "employees._id" : ObjectId("580a0e5bf090aeb82af5566c")}).pretty()

Still returns whole array!

Updates with ObjectIds

The objectId can be used to update a record. For example, we want to update employee 2222.