2017-06-15 16 views
1

mgoを使用してサブ文書を選択したいとします。 選択する前に、クエリは正しい最上位レベルのドキュメントを照会する必要があります。文書の照会とサブ文書の選択

type User struct { 
    Id  bson.ObjectId `bson:"_id,omitempty" json:"-" form:"-"` 
    Wallet Wallet  `bson:"wallet,omitempty" json:"wallet,omitempty" form:"wallet,omitempty"` 
} 

type Wallet struct { 
    Taddr  string `json:"taddr,omitempty" form:"taddr,omitempty"` 
    TaddrPriv string `json:"-" form:"-"` 
    Tbalance float64 `json:"tbalance" form:"tbalance,omitempty"` 
} 

それは、空の財布の文書を返します。

name := "anything" 
w := models.Wallet{} 
c := s.DB("ep2").C("users") 
err := c.Find(bson.M{"name": name}).Select(bson.M{"wallet": 1}).One(&w) 

これらの構造体は次のとおりです。 私はこれを試してみました。

答えて

0

Query.Select()を使用すると、照会するドキュメントのフィールドを指定できますが、取り出したエンティティは選択したフィールドの値ではなく、照会されたドキュメントの値になります。

ですから、"users"コレクションを照会しているので、あなたがQuery.One()*Userの値を渡す必要があります。

name := "anything" 
u := models.User{} 
c := s.DB("ep2").C("users") 
err := c.Find(bson.M{"name": name}).Select(bson.M{"wallet": 1}).One(&u) 
if err != nil { 
    // Handle error 
    return 
} 

// Wallet is in u.Wallet 
fmt.Printf("Result wallet: %+v", u.Wallet) 
+0

はどうもありがとうございました。財布を受け取る方法はありますか?たぶんsth。ウォレットのコレクションを追加して、Userに外部キーを設定するのと同じですか? – nayD93

+0

@ nayD93上記のクエリは、ユーザーにラップされたウォレット(およびユーザーID)のみを取得します。これが気にさえすれば、返されたデータを投影することができる場所で[集約フレームワーク](https://docs.mongodb.com/manual/aggregation/)を使うことができます。そして、ウォレットだけを取り出して、ユーザーIDなし。 ['Collection.Pipe()'](https://godoc.org/gopkg.in/mgo.v2#Collection.Pipe)を出発点として参照してください。 – icza

+0

@ nayD93もちろん、ウォレットを独自のコレクションに分割し、クエリも実行可能なオプションです。 – icza

関連する問題