bor*_*mke 3 struct embedding go mongodb mgo
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"`
}
)
Run Code Online (Sandbox Code Playgroud)
我可能还没有完全理解匿名结构的概念。在上面的示例中,当从集合中查询所有用户时,该id字段将为空字符串""。但是,如果我直接在结构中定义 ID 字段User,则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
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是具有struct类型(包括嵌入结构)的字段在 MongoDB 中显示为嵌入文档。如果您不希望这样,则必须"inline"在嵌入结构时指定 bson 标志:
User struct {
Id `bson:",inline"`
Email string `json:"email" bson:"email"`
}
Run Code Online (Sandbox Code Playgroud)
该"inline"标签的作用是在 MongoDB 中“展平”嵌入结构的字段,就好像它们是嵌入器结构的一部分一样。
相似地:
type UserModel struct {
SoftDelete `bson:",inline"`
}
type BlogPost struct {
SoftDelete `bson:",inline"`
}
Run Code Online (Sandbox Code Playgroud)
编辑:以下部分适用于Id嵌入的原始类型bson.ObjectId。提问者后来澄清说,这只是一个拼写错误(此后编辑了问题),并且它是一个命名的非匿名字段。仍然认为下面的信息很有用。
Id关于您的类型需要注意的一件事:您的Id类型还嵌入 bson.ObjectId:
Id struct {
bson.ObjectId `json:"id" bson:"_id"`
}
Run Code Online (Sandbox Code Playgroud)
Id不仅有 的字段bson.ObjectId,而且还嵌入了它。这很重要,因为您Id输入的这种方式将有一个String()从 提升的方法bson.ObjectId,以及User嵌入的方法Id。话虽如此,尝试打印或调试 type 的值会很困难User,因为您总是会看到它被打印为单个ObjectId.
相反,您可以将其设为 中的常规字段Id,嵌入Id中User仍将按预期工作:
Id struct {
ID bson.ObjectId `json:"id" bson:"_id"`
}
Run Code Online (Sandbox Code Playgroud)
请参阅相关问题+asnwer:使用 mgo 强制执行类型映射
| 归档时间: |
|
| 查看次数: |
706 次 |
| 最近记录: |