2016-05-22 31 views
2

Ich hoffe, das Dokument ObjectId, die gerade jetzt verwenden insertOne einfügen.
Mit meiner Überlegung, ein Weg ist _id auf Client-Seite generieren, ist eine andere Möglichkeit, Abfrage von einem Feld mit dem Dokument angeben. Welche Methode ist besser oder haben andere?
ps: Ich weiß, ObjectId in Mongo mit Maschinen- und Zeitinformationen zu generieren.
In einem Wort, ich frage mich nur das Sprichwort von mongo ObjectId sollte auf Client oder mongod Server generieren bedeutet?Mongo Scala-Treiber erhalten _id nach der Verwendung insertOne

Antwort

1

Wie das MongoDB-Dokument angibt, sollten Sie, wenn Sie das änderbare Dokument verwenden, das Dokument mit der von MongoDB erstellten _id automatisch zurückholen, wenn Sie kein Dokument bereitgestellt haben.

Insert MongoDB -> See warning part

Wie Sie in Scala kennen den größten Teil der Zeit, die wir mit inmutable Objekte standardmäßig arbeiten. Dies ist eine gute Sache, weil Sie die durch die Nebenwirkungen abgeleiteten Fehler vermeiden.

Zum Beispiel, wenn Sie zwei Listen verketten, erhalten Sie eine neue Liste, und das gleiche passiert für eine Karte, wenn Sie einen Schlüssel einfügen, wird eine neue Karte zurückgegeben. Wie in anderen Sprachen als Java möglich, haben Sie nur ein Objekt (einen Zeiger), das seinen internen Status ändern würde.

Wenn Sie also das inmmutable Dokument von Mongo verwenden:

val doc: org.mongodb.scala.bson.collection.immutable.Document = Document("name" -> "MongoDB", "type" -> "database", 
          "count" -> 1, "info" -> Document("x" -> 203, "y" -> 102)) 

collection.insertOne(doc)... 

"doc" wäre inmmutable (so dass Sie nicht die _id automatisch generiert durch Mongo haben).

Aber wenn Sie verwenden:

val doc: org.mongodb.scala.bson.collection.mutable.Document = Document("name" -> "MongoDB", "type" -> "database", 
          "count" -> 1, "info" -> Document("x" -> 203, "y" -> 102)) 

collection.insertOne(doc)... 

Nach dem Einsetzen werden Sie das _id Feld haben in Ihrem "doc" Dokument.

Andere Art und Weise, wie Sie gesagt ist wie immer ein ObjectId mit etwas zu bieten:

val doc: Document = Document("_id" -> ObjectId(), "name" -> "MongoDB"...) 
+0

Wie mutable.Document mit insertOne Methode verwenden? – LoranceChen

+0

Achten Sie darauf, dass die Einfügung im neuen Treiber asynchron ist. Sie müssen also das Observable abonnieren oder in ein Future konvertieren und es verarbeiten ... – pianista

+1

Warum die Methode collection.insertOne() kein veränderbares Dokument als Parameter in scala verwendet Treiber 1.1.1? – LoranceChen