Neptáte se na ObjectId, bez ohledu na to, jak moc si myslíte, že jste. Dotazujete se na ObjectId zakódovaný jako hexadecimální řetězec, což není ta samá věc. Správně přetypujte a pravděpodobně budete mít mnohem větší úspěch.
Upraveno tak, aby bylo propracované, z mongo (JS) REPL shellu:
> // 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" }
Po naší IRC diskuzi se zdá, že je obtížné porozumět "vyhledávaným výrazům" v odpovědích, které dostáváte. Hledejte zde na StackOverflow (nebo Google, nebo DDG) „mongoose typecast ObjectId“ (bez uvozovek; nebo jen „mongoose ObjectId“…) a najdete mnoho odpovědí, protože toto je zvláště běžný problém pro uživatele Mongoose.