匿名结构返回空字段值

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)

icz*_*cza 5

这里的问题是具有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,嵌入IdUser仍将按预期工作:

Id struct {
    ID bson.ObjectId `json:"id" bson:"_id"`
}
Run Code Online (Sandbox Code Playgroud)

请参阅相关问题+asnwer:使用 mgo 强制执行类型映射