匿名结构返回空字段值

时间:2017-01-30 15:04:14

标签: mongodb go struct embedding 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"`
    }
)

我可能还没有完全理解匿名结构的概念。在上面的示例中,当从集合中查询所有用户时,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
}

1 个答案:

答案 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