Du bør vælge mulighed 1.
Hovedårsagen er, at du siger, at du er bekymret for ydeevnen - ved at bruge _id-indekset, som altid er der og allerede er unikt, vil du spare på at skulle opretholde et andet unikt indeks.
For valgmulighed 1 er jeg bekymret for, om indsætningsydelsen gør at have ikke-sekventielle nøgler. Jeg ved, at dette kan dræbe traditionelle RDBMS-systemer, og jeg har set tegn på, at dette også kunne være sandt i MongoDB.
Dine andre muligheder undgår ikke dette problem, de flytter det bare fra _id-indekset til det sekundære unikke indeks - men nu har du to indekser, når først det er rigtigt afbalanceret, og det andet er tilfældig adgang.
Der er kun én grund til at stille spørgsmålstegn ved mulighed 1, og det er, hvis du planlægger at få adgang til dokumenterne med kun den ene eller blot den anden UUID-værdi. Så længe du altid leverer begge værdier og (denne del er meget vigtig) du altid bestiller dem på samme måde i alle dine forespørgsler, så vil _id-indekset effektivt tjene sit fulde formål.
Som en uddybning af, hvorfor du skal sørge for altid at bestille de to UUID-værdier på samme måde, når du sammenligner underdokumenter { a:1, b:2 }
er ikke lig med { b:2, a:1 }
- du kunne have en samling, hvor to dokumenter havde disse værdier for _id. Så hvis du gemmer _id med felt a først, så skal du altid beholde den rækkefølge i alle dine dokumenter og forespørgsler.
Den anden advarsel er indekset på _id:1
vil kunne bruges til forespørgsel:
db.collection.find({_id:{a:1,b:2}})
men det vil ikke være brugbar til forespørgsel
db.collection.find({"_id.a":1, "_id.b":2})