2017-01-30 11 views
2
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 будет пустой строкой "". Однако, если я непосредственно определяю поле ID в структуре User, то отображается id. Разве это не анонимные структуры? В основном расширяется структура, поэтому вам не придется вводить их снова и снова?Anonymous structs return пустое значение поля

Еще пример:

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 
} 

ответ

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, но встраивает его. Это имеет значение, потому что таким образом вы получите String() способ от bson.ObjectId, и так будет User, который введет Id. Сказав это, будет трудно попытаться напечатать или отладить значения типа User, потому что вы всегда будете видеть его напечатанным как один ObjectId.

Вместо этого, вы можете сделать это регулярное поле в Id, вложение Id в User все еще будет работать, как ожидалось:

Id struct { 
    ID bson.ObjectId `json:"id" bson:"_id"` 
} 

См родственный вопрос + asnwer: Enforce a type mapping with mgo

+0

Оу извините, я забыл набрать ' ID' в первом блоке кода. На самом деле это в моем коде, я просто забыл добавить его к этому вопросу. Спасибо, что указали на тег 'inline'. Это сделало это для меня, спасибо кучам! Кстати, теперь вы ответили на два моих вопроса «mgo», как принято! :) – borislemke

 Смежные вопросы

  • Нет связанных вопросов^_^