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フィールドは空の文字列""になります。しかし、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 
} 

答えて

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"` 
} 

編集:以下のセクションでは、bson.ObjectIdを埋め込み元Idタイプに適用されます。質問者は、これがちょうどタイプミスであったことを明らかにして以来、質問を編集しました。名前は、非匿名のフィールドです。まだ以下の情報が役に立つと思う。あなたのIdタイプについて注意する

一つのこと:あなたのIdタイプもbson.ObjectIdを埋め込む:

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

Idだけbson.ObjectIdのフィールドを持っていますが、それはそれを埋め込みません。これは、Idタイプがbson.ObjectIdから昇格されたString()メソッドを持つようになり、Userに埋め込まれ、Idが埋め込まれるためです。あなたが常に単一のObjectIdとして印刷されるのを見るので、タイプUserの値を印刷またはデバッグしようとするのは難しいでしょう。 Enforce a type mapping with mgo

+0

は申し訳ありませんがおお、私は 'を入力するのを忘れ:

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

は、関連する質問+ asnwerを参照してください:

は、代わりにあなたは期待通りまだ動作しますIdUserに埋め込む、Idにそれを定期的にフィールドを作ることができます第1のコードブロック内の「ID」を含む。実際に私のコードには、この質問に追加するのを忘れてしまっただけです。 'inline'タグを指摘してくれてありがとう。それは私のためにそれをした、おかげでヒープ! Btw、あなたは今私の2つの「mgo」質問のうち2つに合格して答えました! :) – borislemke

関連する問題