Ich frage mich, wie Mongodb das Feld "_id" vergleicht, wenn Abfragen wie die folgenden ausgeführt werden:
db.data.find({"_id":{$gt:ObjectId("502aa46c0674d23e3cee6152")}}).sort({"_id":1}).limit(10);
Basiert es nur auf dem Zeitstempelteil der ID?
Antworten:
Um etwas näher auf das einzugehen, was Andre gesagt hat:
Da der ObjectID-Zeitstempel nur auf die Sekunde genau ist, können problemlos zwei (oder mehr) ObjectIDs mit demselben Wert für den Zeitstempel (die ersten 4 Bytes) erstellt werden. Wenn diese auf demselben Computer (Maschinen-ID - die nächsten 3 Bytes) durch denselben Prozess (PID - die nächsten 2 Bytes) erstellt würden, wäre das einzige, was sie unterscheidet, das Feld "inc", die letzten 3 Bytes Am Ende.
Update: Januar 2020
Diese Antwort ist weiterhin beliebt, daher lohnt es sich, sie ein wenig zu aktualisieren. Die ObjectID-Spezifikation hat sich weiterentwickelt, seit diese Antwort vor 8 Jahren geschrieben wurde. Die 5 Bytes nach dem Zeitstempel sind jetzt einfach zufällig, was die Wahrscheinlichkeit von Kollisionen erheblich verringert. Die letzten drei Bytes sind immer noch inkrementell, werden jedoch zu Beginn mit einem zufälligen Wert initialisiert, wodurch Kollisionen wiederum weniger wahrscheinlich werden. Die ObjectID enthält jetzt weniger Kontext (Sie können nicht leicht sagen, wo und durch welchen Prozess sie generiert wurde), aber ich würde vermuten, dass die Informationen nicht in sinnvoller Weise verwendet wurden und zugunsten einer besseren Randomisierung der ID veraltet sind.
Update beenden
Die vollständige Spezifikation finden Sie hier:
https://docs.mongodb.com/manual/reference/method/ObjectId/#ObjectIDs-BSONObjectIDSpecification
Dieses "inc" -Feld ist entweder ein ständig inkrementierendes Feld (dann können Sie vernünftigerweise erwarten, dass sich die Sortierung in der Einfüge- / Erstellungsreihenfolge befindet) oder ein zufälliger Wert (dann wahrscheinlich eindeutig, aber nicht geordnet), vorausgesetzt, die Spezifikation ist natürlich korrekt implementiert . Beachten Sie, dass die ObjectIDs möglicherweise vom Treiber oder der Anwendung (oder sogar manuell) und nicht von MongoDB selbst generiert werden. Wenn Sie also nicht die vollständige Kontrolle darüber haben, wie sie generiert werden, können einige oder alle der oben genannten Punkte zutreffen.
ObjectId
oder auto increment
Primärschlüssel, wenn wir in dieser Spalte in Mongodb sortieren müssen?
In gewisser Weise sind Sie richtig, wenn Sie nach dem sortieren, werden Sie nach der _id
Einfügezeit sortieren. Dies bedeutet nicht, dass der einzige Vergleich für den Zeitstempelabschnitt durchgeführt wird. ObjectIDs sind eigenständige BSON-Objekttypen und können direkt miteinander verglichen werden. Da sie mit einem Zeitstempel beginnen, folgt logischerweise, dass diejenigen in der Vergangenheit geringer sein werden als diejenigen in der Zukunft.
Weitere Details finden Sie in der Dokumentation
Kopieren Einfügen aus Mongo-Spezifikationen https://docs.mongodb.com/manual/reference/bson-types/#objectid
Die Beziehung zwischen der Reihenfolge der ObjectId-Werte und der Generierungszeit ist nicht innerhalb einer Sekunde streng . Wenn mehrere Systeme oder mehrere Prozesse oder Threads auf einem einzelnen System innerhalb einer Sekunde Werte generieren; ObjectId-Werte stellen keine strikte Einfügereihenfolge dar. Ein Zeitversatz zwischen Clients kann auch bei Werten zu einer nicht strengen Reihenfolge führen, da Client-Treiber ObjectId-Werte generieren und nicht den Mongod-Prozess.