U vraagt niet om een ObjectId, hoeveel u ook denkt te zijn. U zoekt naar de ObjectId die is gecodeerd als een hexadeciale tekenreeks, wat niet is hetzelfde. Typecast op de juiste manier en je zult waarschijnlijk veel meer succes hebben.
Bewerkt om uit te werken, van een 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" }
Na onze IRC-discussie lijken er problemen te zijn met het begrijpen van de "doorzoekbare termen" in de antwoorden die u krijgt. Zoek hier op StackOverflow (of Google, of DDG) naar "mongoose typecast ObjectId" (zonder aanhalingstekens; of gewoon "mongoose ObjectId"...) en u zult veel antwoorden vinden, aangezien dit een bijzonder veelvoorkomend probleem is voor Mongoose-gebruikers.