2016-06-13 6 views
2

Also speichere ich die ObjectId eines post innerhalb einer comment BSON. Ein Beispiel für meine BSON Schema ist wie folgt:

{ "_id" : ObjectId("570175e6c002e46edb92aaa5"), "userid" : "56f3f70d4de8c74a69d1d5e1", "postid" : "5700edfe03fcdb000347beaa" } 

Nun, ich möchte 5700edfe03fcdb000347bebc alle Beiträge unter dem postid finden. So

Ich gehe:

"$match" : { 
      "postid" : { 
       "$lt" : "5700edfe03fcdb000347bebc" 
      } 
} 

Allerdings ist die $ lt Aggregation Bediener eine String ID anstelle eines ObjectID zu vergleichen und die zurückgegebenen Ergebnisse ist immer noch genau. Also, wenn diese eine Liste meiner postids ist:

{ "_id" : "5700edfe03fcdb000347beda" } 
{ "_id" : "5700edfe03fcdb000347bebf" } 
{ "_id" : "5700edfe03fcdb000347bebc" } 
{ "_id" : "5700edfe03fcdb000347bebb" } 
{ "_id" : "5700edfe03fcdb000347beaa" } 
{ "_id" : "5700edfb03fcdb000347bebe" } 
{ "_id" : "5700edfb03fcdb000347beba" } 

Es zurückkehren:

{ "_id" : "5700edfe03fcdb000347bebb" } 
{ "_id" : "5700edfe03fcdb000347beaa" } 
{ "_id" : "5700edfb03fcdb000347bebe" } 
{ "_id" : "5700edfb03fcdb000347beba" } 

Allerdings frage ich mich, ob dies immer der Fall sein wird, oder war das oben nur Glück?

Ich verstehe, dass Sortierung ObjectID immer ein genaues Ergebnis zurückgibt, da innerhalb einer ObjectId ein Zeitstempel ist, so dass es den Zeitstempel verwenden kann, um ObjectId genau zu sortieren. Innerhalb einer Zeichenkette gibt es keinen Zeitstempel, also wird er genau sortieren?

Antwort

1

Mongo verwendet ASCII-Betically String-Vergleich, die Groß-und Kleinschreibung ist. In diesem Fall wird das funktionieren, aber im Leistungsbereich denken - es ist langsam.

Als objectId Feld ist ein 12-Bit-Objekt, so dass es entsprechende Zeichenfolge in String wird mehr Platz in Anspruch nehmen, zwei Dokumente mit

{ 
    "_id" : ObjectId("575f2aa031dcfb59af388e1f"), 
    "a" : 2.0, 
    "id" : "575f2a5731dcfb59af388e1e" 
},{ 
    "_id" : ObjectId("575f2ab031dcfb59af388e21"), 
    "a" : 3.0, 
    "id" : ObjectId("575f2ab031dcfb59af388e20") 
} 

und Kontrolle Größe:

Object.bsonsize(db.test.findOne({a:2})) // returns 66 
Object.bsonsize(db.test.findOne({a:3})) // returns 49 

gibt 17 Bytes weniger bei der Verwendung von objeciId.

Ist das Spiel einen Deal wert? Ja, wenn das Feld indiziert ist - Indexdatei ist kleiner => schneller, weniger Lesevorgänge, mehr Leistung

Verwandte Themen