Panda Noir

JavaScript の限界を究めるブログでした。最近は幅広めに書いてます。

mgoでよく使いそうな処理をまとめてみた

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

f:id:panda_noir:20181220171255p:plain

ネストした配列に対してマッチングしたい

たとえばごちうさのデータ構造として「店舗をドキュメントとし、店舗ごとに従業員の配列を持つ」とします。このとき「ラビットハウスで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)
}