sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB ObjectIds exponering

Kort version:ja, använd String överallt.

Om du är ok med kommentarer, använd då :

[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }

Annars kan du använda en klasskarta :

BsonClassMap.RegisterClassMap<i_YourModel>(cm =>
 {
  cm.AutoMap();
  cm.SetIdMember(cm.GetMemberMap(x => x.Id)
    .SetIdGenerator(StringObjectIdGenerator.Instance));
 }
);

Lång version :

Det är lämpligt att använda något ogenomskinligt, som inte är direkt kopplat till den underliggande databasimplementeringen, i din modell och tjänstelager så mycket som möjligt (när det är möjligt).

Tidigare var primärnyckel-ID vanligtvis stora siffror, som sedan mappades till en kolumn med primärnyckel i databasen. Men när man tilldelar ett nytt id till en ny enhet, måste en kontroll av databasen göras för att säkerställa att man har ett unikt id. Det finns många tekniker, från LO-HI id-generatorer, till auto_increment-kolumner, till sekvenser etc.

Med NoSQL, och behovet av mer parallellitet, använder de flesta applikationer nu UUID eller varianter av det, eftersom ID:t kan genereras med rimliga sannolikheter kommer det att vara unikt utan att behöva fråga databasen om den verkligen är unik, eller använda sekvenser eller liknande, som är flaskhalsar i en applikation som skalas horisontellt.

MongoDB är ingen skillnad, och använder ObjectId som är ett slags UUID.

Dessa id (både mongo och andra) kan alltid representeras som strängar, vanligtvis en HEX-representation av byten som utgör nyckeln. Så, i din modell använd String som id, i ditt servicelager samma, i ditt datalager konvertera det till vilket format som helst som är bättre för din underliggande databasimplementering, MongoDB i det här fallet.



  1. MongoDB som kötjänst?

  2. Kan inte starta MongoDB som en tjänst

  3. MongoDB Aggregate Time Series

  4. MongoDB distinkt aggregering