2017-06-15 192 views
1

我想使用mgo選擇一個子文檔。 在選擇之前,查詢應該查詢右頂層文檔。 我嘗試這樣做:查詢文檔並選擇子文檔

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) 

這些都是結構:

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

它返回一個空錢包文件。

回答

0

使用Query.Select()您可以指定要檢索的查詢文檔的哪些字段,但檢索到的實體將不是所選字段的值,它們仍將是查詢文檔的值!

那麼既然要查詢的"users"集合,您應該的*User值傳遞給Query.One()

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

非常感謝你。有沒有辦法只接收錢包?也許......像添加錢包收集併爲用戶設置外鍵? – nayD93

+0

@ nayD93上面的查詢只檢索包裹在用戶中的錢包(加上用戶ID)。如果即使這樣做會困擾你,你也可以使用[聚合框架](https://docs.mongodb.com/manual/aggregation/)來投影返回的數據,然後你可以只檢索錢包,解包,沒有用戶標識。以['Collection.Pipe()'](https://godoc.org/gopkg.in/mgo.v2#Collection.Pipe)爲起點。 – icza

+0

@ nayD93當然,將錢包拆分成自己的集合並查詢這也是一個可行的選擇。 – icza