Difference between revisions of "MongoDB ObjectIds"

From mi-linux
Jump to navigationJump to search
Line 39: Line 39:
 
   projno: 110,  
 
   projno: 110,  
 
   proj_name: 'Oracle Project',
 
   proj_name: 'Oracle Project',
   budget: 10000,
+
   budget: 10000
 
   }
 
   }
 
   )
 
   )
Line 47: Line 47:
 
   projno: 120,  
 
   projno: 120,  
 
   proj_name: 'MongoDB Project',
 
   proj_name: 'MongoDB Project',
   budget: 20000,
+
   budget: 20000
 
   }   
 
   }   
 
  )
 
  )
Line 57: Line 57:
 
   projno: 210,  
 
   projno: 210,  
 
   proj_name: 'Other Oracle Project',
 
   proj_name: 'Other Oracle Project',
   budget: 10000,
+
   budget: 10000
 
   }
 
   }
 
   )
 
   )
Line 68: Line 68:
 
   projno: 140,  
 
   projno: 140,  
 
   proj_name: 'ObjectId Project',
 
   proj_name: 'ObjectId Project',
   budget: 25000,
+
   budget: 25000
 
   } )
 
   } )
 
   
 
   

Revision as of 19:02, 10 November 2016

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 unique within the collection. Alternatively, you can use the ObjectId() function to add one, which will be globally unique.

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

To see our new department:

db.deptCollection.find({deptno: 70}).pretty()


The ObjectId is a manual document reference. A second query is needed to return the project's results:

db.projCollection.findOne( { _id: ObjectId("your_object_id) })

Next step

Return to the Workbook.