Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 官方mongo go驱动程序的UpdateOne中$set的bson语法是什么_Mongodb_Go - Fatal编程技术网

Mongodb 官方mongo go驱动程序的UpdateOne中$set的bson语法是什么

Mongodb 官方mongo go驱动程序的UpdateOne中$set的bson语法是什么,mongodb,go,Mongodb,Go,我正在尝试熟悉UpdateOne的正式语法和正确语法 我最简单的完整示例如下: (注意:为了使用此代码,您需要替换您自己的用户名和服务器名,并将登录密码导出到环境中作为MONGO_PW): 主程序包 进口( “上下文” “fmt” “操作系统” “go.mongodb.org/mongo-driver/bson” “go.mongodb.org/mongo-driver/bson/primitive” “go.mongodb.org/mongo-driver/mongo” “go.mongodb

我正在尝试熟悉
UpdateOne
的正式语法和正确语法

我最简单的完整示例如下:

(注意:为了使用此代码,您需要替换您自己的用户名和服务器名,并将登录密码导出到环境中作为MONGO_PW):

主程序包
进口(
“上下文”
“fmt”
“操作系统”
“go.mongodb.org/mongo-driver/bson”
“go.mongodb.org/mongo-driver/bson/primitive”
“go.mongodb.org/mongo-driver/mongo”
“go.mongodb.org/mongo-driver/mongo/options”
)
类型数据库结构{
用户字符串
服务器字符串
数据库字符串
集合字符串
客户端*mongo.Client
上下文
}
var db=db{
用户:,
服务器:,
数据库:“测试”,
收藏:“电影”,
Ctx:context.TODO(),
}
类型电影结构{
ID primitive.ObjectID`bson:“\u ID”json:“ID”`
名称字符串`bson:“Name”json:“Name”`
描述字符串`bson:“Description”json:“Description”`
}
func main(){
如果错误:=db.Connect();错误!=nil{
fmt.Println(“错误:无法连接”)
操作系统退出(1)
}
fmt.Println(“已连接”)
//代码假设敦刻尔克的原始条目如下
//{“名字”:“敦刻尔克”,“描述”:“第二次世界大战电影”}
UpdateMovie:=电影{
名称:“敦刻尔克”,
描述:“关于二战中英国人撤离的电影”,
}
res,err:=db.UpdateByName(updateMovie)
如果错误!=零{
fmt.Println(“更新电影时出错:”,错误)
操作系统退出(1)
}
如果res.MatchedCount<1{
fmt.Println(“错误:更新不匹配任何文档”)
操作系统退出(1)
}
}
//UpdateByName更改由电影名称标识的电影的描述
func(db*db)UpdateByName(电影)(*mongo.UpdateResult,错误){
筛选器:=bson.D{“name”,movie.name}
res,err:=db.Client.Database(db.Database).Collection(db.Collection).UpdateOne(
db.Ctx,
过滤器,
电影,,
)
如果错误!=零{
返回零,错误
}
返回res,无
}
//Connect假定数据库密码存储在
//环境变量MONGO_PW
func(db*db)Connect()错误{
pw,ok:=os.LookupEnv(“MONGO_pw”)
如果!好的{
fmt.Println(“错误:无法在环境中找到MONGO_PW”)
操作系统退出(1)
}
mongoURI:=fmt.Sprintf(“mongodb+srv://%s:%s@%s”,db.User,pw,db.Server)
//设置客户端选项并验证连接
clientOptions:=options.Client().ApplyURI(mongoURI)
客户端,错误:=mongo.Connect(db.Ctx,clientOptions)
如果错误!=零{
返回错误
}
err=client.Ping(db.Ctx,nil)
如果错误!=零{
返回错误
}
db.Client=Client
归零
}
包文档中的
UpdateOne
函数签名为:

func(coll*Collection)UpdateOne(ctx context.context,过滤器接口{},
更新接口{},opts…*options.UpdateOptions)(*UpdateResult,error)
因此,在为函数创建
updateinterface{}
参数时,我显然犯了某种错误,因为我遇到了这个错误

更新电影时出错:更新文档必须包含以“$”开头的密钥 最流行的答案是我需要使用这样的文档

{ $set: {"Name" : "The Matrix", "Decription" "Neo and Trinity kick butt" } }
但是逐字逐句地讲,这不会在mongo go驱动程序中编译


我想我需要某种形式的bson文档来符合Go语法。为
update
创建此bson文档的最佳和/或最有效的语法是什么?

在使用此文档一段时间后,经过大量的尝试和错误后,我能够通过更改上面代码中的
UpdateByName
函数来解决此问题,如下所示:

//UpdateByName更改由名称标识的电影的描述
func(db*db)UpdateByName(电影)(*mongo.UpdateResult,错误){
筛选器:=bson.D{“name”,movie.name}
更新:=bson.D{{“$set”,
bson.D{
{“描述”,电影,描述},
},
}}
res,err:=db.Client.Database(db.Database).Collection(db.Collection).UpdateOne(
db.Ctx,
过滤器,
更新,
)
如果错误!=零{
返回零,错误
}
返回res,无
}
请注意使用了
bson.D{$“set”…
。不幸的是,MongoDB实现了
bson
包,该语法仍然无法通过go-vet。如果有人对下面的lint冲突有意见,我们将不胜感激

go.mongodb.org/mongo-driver/bson/primitive.E复合文字使用无眼字段

在许多情况下,您可以替换构造

filter:=bson.D{{“name”,movie.name}

filter:=bson.M{“name”:movie.name}

如果参数顺序不重要

我们如何更新整个
电影
字段而不提及更新文档中的每个字段?这就是我实现更新过滤器的方式--update:=bson.D{primitive.E{Key:$set,Value:bson.D{primitive.E{Key:“name”,Value:supplier.name},primitive.E{Key:“documentType”如果您想替换整个文档,而不仅仅是某些字段,您可能需要考虑使用ReopeOne(),而不是UpDeNeOne()“Suntururo”,请写一个答案并提供一些细节。这对读者来说是有帮助的。