В документации mongodb говорится:
Поля и значения обоих параметров и, если параметр содержит только выражения оператора обновления. Обновление создает базовый документ из предложений равенства в параметре, а затем применяет выражения обновления из параметра.
И в документации mgo говорится:
Upsert находит единственный документ, соответствующий предоставленному документу селектора, и изменяет его в соответствии с документом обновления. Если документ, соответствующий селектору, не найден, документ обновления применяется к документу селектора, и результат вставляется в коллекцию.
Но если я сделаю подобное:
session.UpsertId(data.Code, data)
В итоге я получаю запись, в которой mongodb автоматически генерирует ObjectID вместо data.Code.
это означает, что UpsertId ожидает, что данные будут сформированы с помощью операторов обновления, и вы не можете использовать произвольную структуру? Или что мне здесь не хватает?
Pd. Mongo 2.4.9 mgo v2 golang go версия devel + f613443bb13a
РЕДАКТИРОВАТЬ:
Это пример того, что я имею в виду, используя образец кода от Нила Ланна:
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)
}