Możesz również użyć obiektów dla pola _id. Pole _id jest zawsze unikatowe. W ten sposób otrzymasz złożony klucz podstawowy:
{ _id : { a : 1, b: 1} }
Tylko uważaj podczas tworzenia tych identyfikatorów, że kolejność kluczy (a i b w przykładzie) ma znaczenie, jeśli je zamienisz, zostanie to uznane za inny obiekt.
Inną możliwością jest pozostawienie samego _id i utworzenie unikalnego indeksu złożonego.
db.things.ensureIndex({firstname: 1, lastname: 1}, {unique: true});
//Deprecated since version 3.0.0, is now an alias for db.things.createIndex()
https://docs.mongodb.org/v3.0/reference/method/db.collection.ensureIndex/