Non stai cercando un ObjectId, non importa quanto pensi di essere. Stai cercando l'ObjectId codificato come stringa esadecimale, che non la stessa cosa. Typecast correttamente e probabilmente avrai molto più successo.
Modificato per elaborare, da una shell REPL mongo (JS):
> // 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" }
Dopo la nostra discussione su IRC, sembra esserci difficoltà nel comprendere i "termini ricercabili" nelle risposte che ti vengono fornite. Cerca qui su StackOverflow (o Google o DDG) "mongoose typecast ObjectId" (senza virgolette; o semplicemente "mongoose ObjectId"...) e troverai molte risposte, poiché questo è un problema particolarmente comune per gli utenti di Mongoose.