Du forespørger ikke efter et ObjectId, uanset hvor meget du tror, du er. Du forespørger efter ObjectId kodet som en hexideciel streng, hvilket ikke er det samme. Korrekt typecast, og du vil sandsynligvis have langt mere succes.
Redigeret for at uddybe, fra en mongo (JS) REPL shell:
> // Omitting the _id, or generating a new one, are equivalent during insert.
> db.foo.insert({_id: ObjectId()})
WriteResult({ "nInserted" : 1 })
> db.foo.find() // As expected, we get back our _real_ ObjectId value.
{ "_id" : ObjectId("5c9cfab873724727778c0730") }
> // Can we "insert the record again" using a string version of the ID?
> db.foo.insert({_id: "5c9cfab873724727778c0730"})
WriteResult({ "nInserted" : 1 }) // Sure as heck can! No unique violation!
> db.foo.find() // Because THESE ARE NOT THE SAME
{ "_id" : ObjectId("5c9cfab873724727778c0730") }
{ "_id" : "5c9cfab873724727778c0730" }
Efter vores IRC-diskussion ser det ud til, at der er svært ved at forstå de "søgbare termer" i de svar, du får. Søg her på StackOverflow (eller Google eller DDG) efter "mongoose typecast ObjectId" (uden anførselstegn; eller bare "mongoose ObjectId"...), og du vil finde mange svar, da dette er et særligt almindeligt problem for Mongoose-brugere.