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:admin@localhost");

  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

Schreibe einen Kommentar