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"` } ) Es posible que aún no haya entendido completamente el concepto de estructuras anónimas. En el ejemplo anterior, al consultar a todos los usuarios de una colección, el campo de id será una cadena vacía "" . Sin embargo, si defino directamente el campo ID en la estructura de User , la id aparece bien. ¿No es esto para lo que son las estructuras anónimas? ¿Básicamente extender la estructura para que no tenga que escribirlos una y otra vez?
Más ejemplo:
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 }El problema aquí es que los campos que tienen tipos de struct (incluidas las estructuras incrustadas) aparecen como documentos incrustados en MongoDB. Si no desea esto, debe especificar el indicador bson "inline" al incrustar una estructura:
User struct { Id `bson:",inline"` Email string `json:"email" bson:"email"` } Lo que hace la etiqueta "inline" en MongoDB es que "aplana" los campos de la estructura incrustada como si fueran parte de la estructura del incrustador.
Similarmente:
type UserModel struct { SoftDelete `bson:",inline"` } type BlogPost struct { SoftDelete `bson:",inline"` } Editar: la siguiente sección se aplica al tipo de Id original que incrustó bson.ObjectId . El autor de la pregunta aclaró más tarde que esto era solo un error tipográfico (y editó la pregunta desde entonces), y es un campo con nombre, no anónimo. Todavía creo que la información a continuación es útil.
Una cosa a tener en cuenta sobre su tipo de Id : su tipo de Id también bson.ObjectId :
Id struct { bson.ObjectId `json:"id" bson:"_id"` } Id no solo tiene un campo de bson.ObjectId , sino que lo incorpora. Esto es importante porque de esta manera su tipo de Id tendrá un método String() promovido desde bson.ObjectId , y también lo tendrá el User que incrusta Id . Habiendo dicho eso, será difícil intentar imprimir o depurar valores de tipo User , porque siempre lo verá impreso como un único ObjectId .
En su lugar, puede convertirlo en un campo regular en Id , incrustar Id en User seguirá funcionando como se esperaba:
Id struct { ID bson.ObjectId `json:"id" bson:"_id"` }Ver pregunta+respuesta relacionada: Aplicar una asignación de tipo con mgo