type (
Id struct {
// I previously forgot to add the `ID` field in my question, it is present in my code but not on this question as @icza pointed it out to me
ID bson.ObjectId `json:"id" bson:"_id"`
}
User struct {
// When using anonymous struct, upon returning the collection, each of the document will have an empty `id` field, `id: ""`
Id
Email string `json:"email" bson:"email"`
...
}
// This works
User2 struct {
ID bson.ObjectId `json:"id" bson:"_id"`
Email string `json:"email" bson:"email"`
}
)
我可能还没有完全理解匿名结构的概念。在上面的示例中,当从集合中查询所有用户时,id
字段将是一个空字符串""
。但是,如果我直接在User
结构中定义ID字段,则id
显示正常。这不是匿名结构的用途吗?基本上扩展结构,所以你不必一次又一次地输入它们?
更多示例:
type SoftDelete struct {
CreatedAt time.Time `json:"created_at" bson:"created_at"`
UpdatedAt time.Time `json:"updated_at" bson:"updated_at"`
DeletedAt time.Time `json:"deleted_at" bson:"deleted_at"`
}
type UserModel struct {
SoftDelete
}
type BlogPost struct {
SoftDelete
}
答案 0 :(得分:3)
这里的问题是具有struct
类型(包括嵌入式结构)的字段在MongoDB中显示为嵌入式文档。如果你不想这样,你必须在嵌入结构时指定"inline"
bson标志:
User struct {
Id `bson:",inline"`
Email string `json:"email" bson:"email"`
}
"inline"
标记在MongoDB中的作用是什么"变平"嵌入式结构的字段就好像它们是嵌入式结构的一部分一样。
类似地:
type UserModel struct {
SoftDelete `bson:",inline"`
}
type BlogPost struct {
SoftDelete `bson:",inline"`
}
修改:以下部分适用于嵌入Id
的原始bson.ObjectId
类型。提问者后来澄清说这只是一个错字(并编辑了问题),它是一个命名的非匿名字段。仍然认为以下信息很有用。
关于Id
类型的一件事:您的Id
类型嵌入 bson.ObjectId
:
Id struct {
bson.ObjectId `json:"id" bson:"_id"`
}
Id
不仅有bson.ObjectId
字段,而且还嵌入了它。这很重要,因为Id
类型的这种方式会String()
方法从bson.ObjectId
升级,User
嵌入Id
的方法也是User
。话虽如此,尝试打印或调试ObjectId
类型的值会很困难,因为您始终会将其打印为单个Id
。
相反,您可以将其设为Id
中的常规字段,在User
中嵌入Id struct {
ID bson.ObjectId `json:"id" bson:"_id"`
}
仍将按预期工作:
TextureRegion
请参阅相关问题+ asnwer:Enforce a type mapping with mgo