Mongodb Sortierreihenfolge auf _id

72

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?

Sam
quelle

Antworten:

58

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.

Adam Comerford
quelle
3
Da es von der App generiert wird, wird es technisch (hier puristisch) nie nach Einfügung sortiert, sondern wenn der Treiber die _id auf das Dokument angewendet hat.
Sammaye
3
Da wir die technischen Details beachten, wird die _id von der App generiert, wenn sie oder der Treiber (oder Sie) sie clientseitig angeben. Wenn beim Einfügen keine _id als Teil des Dokuments übergeben wird, wird die _id vom Server generiert, sodass der Treiber sie nicht immer auf ein Dokument anwendet.
Adam Comerford
1
Was ist besser ObjectIdoder auto incrementPrimärschlüssel, wenn wir in dieser Spalte in Mongodb sortieren müssen?
Rohit Khatri
ObjectId ist die Standardeinstellung und es gibt mehrere Optimierungen in der Codebasis. Ich habe zwar nicht getestet, und ich gehe davon aus, dass die Unterschiede gering sein werden, aber wenn ich eine fundierte Vermutung anstellen würde, würde ich mich für ObjectId über ein automatisch inkrementierendes Feld entscheiden
Adam Comerford,
Ich weiß nicht, wer oder ob jemand dies wissen muss. Find () in mongodb garantiert nicht, dass die zurückgegebenen Dokumente in derselben Reihenfolge vorliegen, in der sie eingefügt wurden. Oder sortiert nach _id Sie müssen die Sortierung bei Bedarf explizit angeben.
Yogesh
30

In gewisser Weise sind Sie richtig, wenn Sie nach dem sortieren, werden Sie nach der _idEinfü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

Andre de Frere
quelle
15

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.

Andrejro
quelle