mgo(GolangのMongoDBドライバ)の逆引き辞典のような感じの記事になります。まだ少ないですが。

ネストした配列に対してマッチングしたい
たとえばごちうさのデータ構造として「店舗をドキュメントとし、店舗ごとに従業員の配列を持つ」とします。このとき「ラビットハウスで14歳の従業員」を探したいとします。このクエリの書き方、微妙にコツがいります。
query := bson.M{"name": "ラビットハウス"}
memberQuery := bson.M{"members":
bson.M{"$elemMatch":
bson.M{"name": nameQuery}
}
}
if err := DB.Find(query).Select(memberQuery).One(&s); err != nil {
fmt.Printf("%+v \n", err)
}
// 返されるの自体は店舗のデータ。ただし従業員は絞り込まれている。
こんな感じで「Find」で店舗を検索し、「Select」のところで従業員の絞り込みを行います。ちなみにこのSelect部分はprojectionと呼ばれています。
ネストした配列にオブジェクトを追加する
オブジェクトを追加するとき、どう書いたらいいんだろ?と毎回悩むのでここに記しておきます。
query := bson.M{"name": shopQuery}
p := Person{
ID: bson.NewObjectId(),
Name: nameQuery,
Age: ageQuery,
}
if err := DB.Update(query, bson.M{"$push": bson.M{"members": p}}); err != nil {
fmt.Printf("%+v \n", err)
}