根据mongodb文档的说明:
如果参数中只包含更新操作符表达式,则会同时更新和参数的字段和值。更新会从参数中的等式子句创建一个基本文档,然后应用来自参数的更新表达式。
而mgo文档则说明:
Upsert查找匹配提供的选择器文档的单个文档,并根据更新文档进行修改。如果没有找到与选择器匹配的文档,则将更新文档应用于选择器文档,并将结果插入集合。
但是,如果我像这样进行upsert:
session.UpsertId(data.Code, data)
我最终得到的条目具有由mongodb自动生成的ObjectID,而不是数据.Code。
这意味着UpsertId期望数据被格式化为更新运算符,并且您不能使用任意结构体?还是我在这里漏掉了什么?
Pd. Mongo 2.4.9 mgo v2 golang go version devel +f613443bb13a
编辑:
这是我的一个示例,使用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)
}
_id
。这段代码可以实现并且运行正常。如果你有其他意思,也许你可以更明确地表达你的问题。Upsert将使用它给定的_id
值,除非有其他原因阻止其这样做。 - Neil Lunn_id
值。从我的清单和你的清单之间的区别来看,原因很明显。看看结构体上的映射。这就是BSON序列化部分,这正是我所说的。 - Neil Lunn