sql >> Database >  >> NoSQL >> MongoDB

Laatst ingevoegde document-ID in MongoDB ophalen met Java-stuurprogramma

1. Overzicht

Soms hebben we de ID nodig van een document dat we zojuist in een MongoDB-database hebben ingevoegd. We willen bijvoorbeeld de ID terugsturen als reactie op een beller of het gemaakte object loggen voor foutopsporing.

In deze tutorial zullen we zien hoe ID's worden geïmplementeerd in MongoDB en hoe we de ID kunnen ophalen van een document dat we zojuist in een verzameling hebben ingevoegd via een Java-programma.

2. Wat is de ID van een MongoDB-document?

Zoals in elk gegevensopslagsysteem heeft MongoDB een unieke identificatie nodig voor elk document dat in een verzameling is opgeslagen. Deze identifier is gelijk aan de primaire sleutel in relationele databases.

In MongoDB bestaat deze ID uit 12 bytes:

  • een 4-byte tijdstempelwaarde vertegenwoordigt de seconden sinds het Unix-tijdperk
  • een willekeurige waarde van 5 bytes die eenmaal per proces wordt gegenereerd. Deze willekeurige waarde is uniek voor de machine en het proces.
  • een oplopende teller van 3 bytes

De ID wordt opgeslagen in een veld met de naam _id en wordt gegenereerd door de klant. Dit betekent dat de ID moet worden gegenereerd voordat het document naar de database wordt verzonden. Aan de kant van de klant kunnen we ofwel een door de bestuurder gegenereerde ID gebruiken of een aangepaste ID genereren.

We kunnen zien dat documenten die door dezelfde client in dezelfde seconde zijn gemaakt, de eerste 9 bytes gemeen hebben. Daarom is de uniciteit van de ID in dit geval afhankelijk van de teller. Met de teller kan een klant in dezelfde seconde meer dan 16 miljoen documenten maken.

Hoewel het begint met een tijdstempel, moeten we oppassen dat de identifier niet wordt gebruikt als sorteercriterium. Dit komt omdat documenten die in dezelfde seconde zijn gemaakt, niet gegarandeerd worden gesorteerd op aanmaakdatum, omdat de teller niet gegarandeerd monotoon is. Ook kunnen verschillende clients verschillende systeemklokken hebben.

Het Java-stuurprogramma gebruikt een generator voor willekeurige getallen voor de teller, die niet monotoon is. Daarom moeten we de door de bestuurder gegenereerde ID niet gebruiken om te sorteren op aanmaakdatum.

3. De ObjectId Klasse

De unieke identificatie wordt opgeslagen in een ObjectId class die handige methoden biedt om de gegevens die in de ID zijn opgeslagen te krijgen zonder deze handmatig te ontleden.

Zo kunnen we bijvoorbeeld de aanmaakdatum van de ID achterhalen:

Date creationDate = objectId.getDate();

Evenzo kunnen we de tijdstempel van de ID in seconden ophalen:

int timestamp = objectId.getTimestamp();

De ObjectId class biedt ook methoden om de teller, de machine-ID of de proces-ID op te halen, maar ze zijn allemaal verouderd.

4. De ID ophalen

Het belangrijkste om te onthouden is dat in MongoDB de client de unieke identificatie van een Document genereert voordat u het naar het cluster verzendt. Dit in tegenstelling tot sequenties in relationele databases. Dit maakt het ophalen van deze ID vrij eenvoudig.

4.1. Door de bestuurder gegenereerde ID

De standaard en gemakkelijke manier om de unieke ID van een Document te genereren is door de chauffeur het werk te laten doen. Wanneer we een nieuw Document invoegen naar een Collectie , indien geen _id veld bestaat in het Document , genereert het stuurprogramma een nieuw ObjectId voordat u het insert-commando naar het cluster verzendt.

Onze code om een ​​nieuw Document in te voegen in uw collectie kan er als volgt uitzien:

Document document = new Document();
document.put("name", "Shubham");
document.put("company", "Baeldung");
collection.insertOne(document);

We kunnen zien dat we nooit aangeven hoe de ID moet worden gegenereerd.

Wanneer de insertOne() methode retourneert, kunnen we de gegenereerde ObjectId uit het Document :

ObjectId objectId = document.getObjectId("_id");

We kunnen ook de ObjectId . ophalen zoals een standaardveld van het Document en vervolgens casten naar ObjectId :

ObjectId oId = (ObjectId) document.get("_id");

4.2. Aangepaste ID

De andere manier om de ID op te halen, is door deze in onze code te genereren en in het Document te plaatsen zoals elk ander veld. Als we een Document sturen met een _id veld naar het stuurprogramma, zal het geen nieuwe genereren.

We kunnen dit in sommige gevallen nodig hebben waar we de ID van het MongoDB Document nodig hebben voordat u het Document invoegt in de Collectie .

We kunnen een nieuwe ObjectId . genereren door een nieuwe instantie van de klasse te maken:

ObjectId generatedId = new ObjectId();

Of we kunnen ook de statische get() . aanroepen methode van de ObjectId klas:

ObjectId generatedId = ObjectId.get();

Vervolgens hoeven we alleen ons Document te maken en gebruik de gegenereerde ID. Om dit te doen, kunnen we het verstrekken in het Document constructeur:

Document document = new Document("_id", generatedId);

Als alternatief kunnen we de put() . gebruiken methode:

document.put("_id", generatedId);

Wanneer we een door een gebruiker gegenereerde ID gebruiken, moeten we voorzichtig zijn met het genereren van een nieuwe ObjectId vóór elke invoeging, omdat dubbele ID's verboden zijn. Dubbele ID's resulteren in een MongoWriteException met een dubbele kernboodschap.

De ObjectId class biedt verschillende andere constructors waarmee we sommige delen van de identifier kunnen instellen:

public ObjectId(final Date date)
public ObjectId(final Date date, final int counter)
public ObjectId(final int timestamp, final int counter)
public ObjectId(final String hexString)
public ObjectId(final byte[] bytes)
public ObjectId(final ByteBuffer buffer)

Maar we moeten heel voorzichtig zijn wanneer we die constructors gebruiken, omdat de uniciteit van de ID die aan het stuurprogramma wordt verstrekt, volledig afhankelijk is van onze code. In deze specifieke gevallen kunnen we dubbele sleutels krijgen:

  • als we dezelfde combinatie van datum (of tijdstempel) en teller meerdere keren gebruiken
  • Als we dezelfde hexadecimale String gebruiken , byte array, of ByteBuffer meerdere keren

  1. Mongoose Unieke waarden in geneste reeks objecten

  2. Hoe verzendt socket.io berichten over meerdere servers?

  3. Subdocumentindex in Mongolië

  4. Krijg positie van geselecteerd document in verzameling [mongoDB]