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) }