Je zou voor optie 1 moeten gaan.
De belangrijkste reden is dat u zegt dat u zich zorgen maakt over de prestaties - door de _id-index te gebruiken die er altijd is en al uniek is, kunt u besparen door een tweede unieke index bij te houden.
Voor optie 1 maak ik me zorgen over de invoegprestaties bij het hebben van niet-sequentiële sleutels. Ik weet dat dit traditionele RDBMS-systemen kan vernietigen en ik heb aanwijzingen gezien dat dit ook het geval zou kunnen zijn in MongoDB.
Je andere opties vermijden dit probleem niet, ze verschuiven het gewoon van de _id-index naar de secundaire unieke index - maar nu heb je twee indexen, de ene is goed gebalanceerd en de andere is willekeurig toegankelijk.
Er is maar één reden om optie 1 in twijfel te trekken en dat is als u van plan bent toegang te krijgen tot de documenten met slechts één of alleen de andere UUID-waarde. Zolang u altijd beide waarden opgeeft en (dit onderdeel is erg belangrijk) u ze altijd op dezelfde manier in al uw zoekopdrachten rangschikt, zal de _id-index efficiënt zijn volledige doel dienen.
Als een uitwerking waarom je ervoor moet zorgen dat je de twee UUID-waarden altijd op dezelfde manier bestelt, bij het vergelijken van subdocumenten { a:1, b:2 }
is niet gelijk aan { b:2, a:1 }
- je zou een verzameling kunnen hebben waar twee documenten die waarden hadden voor _id. Dus als u _id met veld een eerste opslaat, moet u die volgorde altijd aanhouden in al uw documenten en query's.
De andere waarschuwing is dat de index op _id:1
zal bruikbaar zijn voor query:
db.collection.find({_id:{a:1,b:2}})
maar het zal niet bruikbaar zijn voor query's
db.collection.find({"_id.a":1, "_id.b":2})