Nie pytasz o identyfikator obiektu, bez względu na to, jak bardzo myślisz, że jesteś. Pytasz o identyfikator ObjectId zakodowany jako ciąg szesnastkowy, który nie to samo. Prawidłowo zapisz typ, a prawdopodobnie odniesiesz znacznie większy sukces.
Edytowane w celu opracowania, z powłoki 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" }
Po naszej dyskusji na IRC wydaje się, że trudno jest zrozumieć „wyszukiwalne terminy” w udzielanych odpowiedziach. Wyszukaj tutaj na StackOverflow (lub Google lub DDG) „mongoose typecast ObjectId” (bez cudzysłowów lub po prostu „mongoose ObjectId”…), a znajdziesz wiele odpowiedzi, ponieważ jest to szczególnie powszechny problem dla użytkowników Mongoose.