我正在为golang使用新的官方mongodb驱动程序。我创建了一个复杂的查询,将数据插入mongo db,然后根据元素值对其进行排序。我使用的过滤器中,我使用:-创建了bson类型
filter := bson.D{{"autorefid", "100"}}
Run Code Online (Sandbox Code Playgroud)
但它显示警告语:
原始E复合文字使用无键字段
警告在我的代码中造成混乱。
Him*_*shu 25
可以通过将检查标记设置为false来停止警告。
$ go doc cmd/vet
Run Code Online (Sandbox Code Playgroud)
默认情况下,将执行所有检查。如果将任何标志显式设置为true,则仅运行那些测试。相反,如果任何标志显式设置为false,则仅禁用那些测试。因此,-printf = true运行printf检查,-printf = false运行除printf检查之外的所有检查。
Run Code Online (Sandbox Code Playgroud)Unkeyed composite literals Flag: -composites Composite struct literals that do not use the field-keyed syntax.
但是警告是由于在primitive.E
struct中设置值时未提供键名。
为primitive.E
struct 设置键将删除警告消息。例如
filter := bson.D{primitive.E{Key: "autorefid", Value: "100"}}
Run Code Online (Sandbox Code Playgroud)
包原语包含与BSON类型的Go原语相似的类型,不能具有直接Go原语表示形式。
type E struct {
Key string
Value interface{}
}
Run Code Online (Sandbox Code Playgroud)
E代表D的BSON元素。通常在D内使用。
有关更多信息,请查看primitive.E
dba*_*bam 18
你可以改变:
filter := bson.D{{"autorefid", "100"}}
Run Code Online (Sandbox Code Playgroud)
到:
filter := bson.D{primitive.E{Key: "autorefid", Value: "100"}}
Run Code Online (Sandbox Code Playgroud)
ant*_*ris 16
由于没有其他人指出这一点 - 警告是为了保护您免受第三方 API 中的更改而悄悄破坏您的代码。
忽略此vet
警告有可能导致非常讨厌且难以追踪的运行时错误,因此如果您始终明确指定 3rd partystruct
的键,您会更好。
如果您正在使用的库的维护者struct
出于任何原因决定更改其元素的顺序,就会出现这种情况。例如,在 OP 情况下Key
用, 切换Value
。您的代码看起来仍然可以很好地编译,但是您打算作为键的现在将作为值传递,反之亦然,并且事情会以意想不到的方式开始破坏。
dil*_*asr 13
您可以简单地更改:
filter := bson.D{{"autorefid", "100"}}
Run Code Online (Sandbox Code Playgroud)
到:
filter := bson.D{{Key: "autorefid", Value: "100"}}
Run Code Online (Sandbox Code Playgroud)
//跳过primitive.E,如Chris W所说
其实,如果订购一个BSON文档的表示并不一定,你可以你的BSON文档改变无序通过简单地改变表示
filter := bson.D{{"autorefid", "100"}}
Run Code Online (Sandbox Code Playgroud)
到
filter := bson.M{"autorefid": "100"}
Run Code Online (Sandbox Code Playgroud)
有关vs 的更多详细信息,请参阅此stackoverflow 答案。无论使用的顺序如何,MongoDB 服务器都足够智能,可以找到匹配的索引。bson.D
bson.M