复合文字使用无键字段

时间:2019-02-06 07:19:31

标签: mongodb go

我正在使用用于golang的新的官方mongodb驱动程序。我创建了一个复杂的查询,将数据插入mongo db,然后根据元素值对其进行排序。我使用的过滤器是使用:-

创建的bson类型
filter := bson.D{{"autorefid", "100"}}

但是它显示警告:

  

primitive.E复合文字使用无键字段

警告在我的代码中造成混乱。

5 个答案:

答案 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.Dbson.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"}}