Golang mongodb mgo-Treiber-Upsert / UpsertId Dokumentation
Den mongodb-Dokumentation sagt:
Die Felder und Werte von sowohl dem und-Parameter, wenn der parameter enthält nur update-operator-Ausdrücke. Das update erstellt eine Basis-Dokument von der Gleichheit Klauseln in den parameter, und dann gilt das update-Ausdrücke aus der parameter.
Und die mgo-Dokumentation sagt:
Einem einfachen Beispiel: findet ein einzelnes Dokument passend zu den bereitgestellten selector Dokument und ändert es nach dem update-Dokument. Wenn kein Dokument passenden Selektor gefunden, wird das update-Dokument wird angewandt, um die Selektor-Dokument und das Ergebnis ist eingefügt in der Sammlung.
Aber wenn ich ein upsert wie diese:
session.UpsertId(data.Code, data)
Ich am Ende mit einem Eintrag, die ein ObjectID generiert automatisch von mongodb anstelle von Daten.Code.
dies bedeutet, dass UpsertId erwarten, dass die Daten formatiert sein mit der update-Operatoren, und Sie können nicht eine beliebige struct? Oder was fehlt mir hier?
Pd. Mongo 2.4.9 mgo v2 golang-go-version devel +f613443bb13a
EDIT:
Dies ist ein Beispiel, was ich meine mit dem sample-code von Neil Lunn:
package main
import (
"fmt"
"gopkg.in/mgo.v2"
//"gopkg.in/mgo.v2/bson"
)
type Person struct {
Code string
Name string
}
func main() {
session, err := mgo.Dial("admin:[email protected]");
if err != nil {
fmt.Println("Error: ", err)
return
//panic(err)
}
defer session.Close()
session.SetMode(mgo.Monotonic, true)
c := session.DB("test").C("people")
var p = Person{
Code: "1234",
Name: "Bill",
}
_, err = c.UpsertId( p.Code, &p )
result := Person{}
err = c.FindId(p.Code).One(&result)
if err != nil {
fmt.Println("FindId Error: ", err)
return
//panic(err)
}
fmt.Println("Person", result)
}
InformationsquelleAutor Gabriel Díaz | 2014-07-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand ich die Dokumentation der MongoDB richtig war. Der richtige Weg dies zu tun ist, wickeln Sie das struct einfügen in ein update-operator.
Der sample code provided by Neil Lunn, würde wie folgt Aussehen:
Danken Ihnen sehr für Ihr Interesse und Ihre Hilfe Neil.
InformationsquelleAutor Gabriel Díaz
Scheinen Sie zu sprechen über die Zuweisung einer Struktur mit einer benutzerdefinierten
_id
Feld hier ein. Das kommt wirklich darauf an, wie definieren Sie Ihre Struktur. Hier ist ein kurzes Beispiel:So, in der benutzerdefinierten definition hier bin ich-mapping-Feld " ID " zu bson
_id
und definieren Sie den Typ als string. Wie im Beispiel gezeigt-das ist genau das, was passiert, wenn Sie serialisiert über UpsertId und dann abgerufen.Jetzt haben Sie ausgearbeitet, ich werde zeigen, um den Unterschied auf der
struct
definition.Was ich produziert dies:
Was Sie haben ( ohne die gleiche Zuordnung auf die struct ):
Als Sie sehen, die
_id
im upsert wird nie passen, weil keines der Felder in der Struktur zugeordnet sind_id
. Sie brauchen das gleiche wie ich haben:Dass in den Karten ein Feld, um das obligatorische
_id
Feld, sonst ist man automatisch für Sie gefertigt.bson:"_id"
wie es ist, von einem externen Paket.Ich bin sonst nicht wissen, was Sie Fragen. Es scheint, Sie möchten etwas anderes als die
_id
. Dies ist, was dieser code macht und funktioniert. Wenn du meinst etwas anderes, dann vielleicht kannst du deine Frage klarer. Upsert verwenden die_id
Wert ist es gegeben, es sei denn, es ist irgendeine andere Ursache, dass macht es auch nicht tun.Ich habe deine bearbeiteten Probe mit dem, was ich Tue. Hoffe, das hilft, die Frage zu verstehen. Danke!
Wenn ich verstehe, der Ton der Frage, die Sie sagen, dass upsert fügt es der eigenen
_id
Wert. Aus den unterschieden zwischen meiner Liste und verkaufen der Grund ist klar. Blick auf die Zuordnung auf die struct. Dies ist das BSON-Serialisierung Teil, das ist genau das, was ich gesagt habe.Ich verstehe, was du sagst, aber meine Frage ist anders. Das Lesen der mgo-Treiber-Dokumentation "Wenn kein Dokument passenden Selektor gefunden, wird das update-Dokument wird angewandt, um die Selektor-Dokument und das Ergebnis ist eingefügt in die Sammlung" das erwarte ich von einem einfachen Beispiel: Zusammenführen der mitgelieferten Id und die zur Verfügung gestellten Struktur, die wie ein Objekt, und legen Sie dann in die Datenbank. Es funktioniert nicht, also was ist der Sinn dieser "Anwendung" in der Dokumentation?
InformationsquelleAutor Neil Lunn