gpt4 book ai didi

mongodb - Golang mongodb mgo 驱动 Upsert/UpsertId 文档

转载 作者:IT老高 更新时间:2023-10-28 13:36:20 28 4
gpt4 key购买 nike

mongodb documentation说:

如果参数仅包含更新运算符表达式,则 和 参数的字段和值。更新从参数中的等式子句创建一个基础文档,然后应用参数中的更新表达式。

还有 mgo documentation说:

Upsert 查找与提供的选择器文档匹配的单个文档,并根据更新文档对其进行修改。如果没有找到与选择器匹配的文档,则将更新文档应用于选择器文档并将结果插入到集合中。

但如果我做这样的更新:

session.UpsertId(data.Code, data)

我最终得到一个条目,它有一个由 mongodb 自动生成的 ObjectID,而不是 data.Code。

这意味着 UpsertId 期望使用更新运算符格式化数据,并且您不能使用任意结构?或者我在这里缺少什么?

钯。 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)

}

最佳答案

我发现 MongoDB 的文档是正确的。正确的做法是将要插入的结构包装到更新运算符中。

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
}

defer session.Close()

session.SetMode(mgo.Monotonic, true)

c := session.DB("test").C("people")

var p = Person{
Code: "1234",
Name: "Bill",
}
upsertdata := bson.M{ "$set": p}

info , err2 := c.UpsertId( p.Code, upsertdata )
fmt.Println("UpsertId -> ", info, err2)
result := Person{}
err = c.FindId(p.Code).One(&result)
if err != nil {
fmt.Println("FindId Error: ", err)
return
}

fmt.Println("Person", result)

}

非常感谢您对尼尔的关注和帮助。

关于mongodb - Golang mongodb mgo 驱动 Upsert/UpsertId 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24904129/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com