我正在使用用于golang的新的官方mongodb驱动程序。我创建了一个复杂的查询,将数据插入mongo db,然后根据元素值对其进行排序。我使用的过滤器是使用:-
创建的bson类型filter := bson.D{{"autorefid", "100"}}
但是它显示警告:
primitive.E复合文字使用无键字段
警告在我的代码中造成混乱。
答案 0 :(得分:7)
可以通过将复选标记设置为false来停止警告。
$ go doc cmd/vet
默认情况下,将执行所有检查。如果将任何标志显式设置为true,则仅运行那些测试。相反,如果有任何标志 显式设置为false,仅禁用那些测试。从而 -printf = true运行printf检查,-printf = false运行除printf检查之外的所有检查。
Unkeyed composite literals Flag: -composites Composite struct literals that do not use the field-keyed syntax.
但是警告是由于在primtive.E
结构中设置值时未提供键名。
设置primitive.E
结构的键将删除警告消息。例如
filter := bson.D{primitive.E{Key: "autorefid", Value: "100"}}
Package原语包含与BSON的Go原语相似的类型 类型不能具有直接的Go原语表示形式。
type E struct {
Key string
Value interface{}
}
E代表D的BSON元素。通常在D内使用。
有关更多信息,请查看primitive.E
答案 1 :(得分:6)
由于没有其他人指出这一点-警告是为了保护您,防止第三方API的更改使您的代码无声地破坏。
忽略此vet
警告可能会导致真正令人讨厌并且难以跟踪运行时错误,因此,如果您始终指定第三方的密钥{{ 1}} s 。
如果您使用的库的维护者出于任何原因决定更改其struct
中元素的顺序,就会出现这种情况。例如,在OP情况下,用struct
切换Key
。您的代码看起来仍然可以正常编译,但是您原本打算用作键的值现在将作为值传递,反之亦然,事情将以意想不到的方式开始崩溃。
答案 2 :(得分:4)
您可以简单地更改:
filter := bson.D{{"autorefid", "100"}}
收件人:
filter := bson.D{{Key: "autorefid", Value: "100"}}
//跳过原语,如Chris W所说
答案 3 :(得分:4)
实际上,如果不需要 BSON 文档的有序表示,您可以通过简单的更改将 BSON 文档更改为无序表示
filter := bson.D{{"autorefid", "100"}}
到
filter := bson.M{"autorefid": "100"}
有关 bson.D
与 bson.M
的更多详细信息,请参阅 this stackoverflow 答案。 MongoDB 服务器足够智能,无论使用的顺序如何,都可以找到匹配的索引。
答案 4 :(得分:0)
您可以更改:
<div id="visualization"></div>
<div id="visualization2"></div>
...
var container = document.getElementById('visualization');
var container2 = document.getElementById('visualization2');
var timeline = new vis.Timeline(container, items, options);
var update_timeline = timeline;
// neither of these worked:
update_timeline.dom.container.id = container2;
update_timeline.dom.container.id = 'visualization2';
// Was hoping this would recreate the saved timeline
update_timeline.redraw();
收件人:
filter := bson.D{{"autorefid", "100"}}