【告知】値の参照時の仕様変更のお知らせ
このたび2024年11月11日に値の参照に関する仕様変更を予定しておりますので詳細について報告いたします。
more
2023.07.12に公開 | 2023.07.12に更新
Querier運営
「Querier(クエリア)」は社内向け管理画面を圧倒的な速さで、かつビジネスのスケールに合わせて柔軟に構築することができるローコードツールです。
管理画面の構築もWeb上で完結
エンジニアのためのローコードツール
Go言語とMongoDBは、高性能なバックエンドシステムを構築する際の強力な組み合わせと言えます。
MongoDBは、スケーラビリティと性能を兼ね備えたNoSQLデータベースであり、Go言語は並行処理に優れ、シンプルなコードを書くことが可能です。
今回の記事では、Go言語を使ってMongoDBのデータ操作を学びましょう。
まず、Go言語でMongoDBを操作するために必要なライブラリをインストールします。ここでは公式のMongoDBドライバーを使用します。
go get go.mongodb.org/mongo-driver/mongo
次に、MongoDBクライアントを生成します。
詳細な設定方法は公式ドキュメントを参照してください。
package main
import (
"context"
"fmt"
"log"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
func main() {
clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
client, err := mongo.Connect(context.TODO(), clientOptions)
if err != nil {
log.Fatal(err)
}
// Check the connection
err = client.Ping(context.TODO(), nil)
if err != nil {
log.Fatal(err)
}
fmt.Println("Connected to MongoDB!")
}
単一のドキュメントを取得するにはfindOne
メソッドを使用します。
詳細な設定方法は公式ドキュメントを参照してください。
var result bson.M
err := collection.FindOne(context.TODO(), bson.M{}).Decode(&result)
if err != nil {
log.Fatal(err)
}
fmt.Println(result)
複数のドキュメントを取得するにはfind
メソッドを使用します。
詳細な設定方法は公式ドキュメントを参照してください。
findOptions := options.Find()
var results []*bson.M
cur, err := collection.Find(context.TODO(), bson.M{}, findOptions)
if err != nil {
log.Fatal(err)
}
for cur.Next(context.TODO()) {
var elem bson.M
err := cur.Decode(&elem)
if err != nil {
log.Fatal(err)
}
results = append(results, &elem)
}
if err := cur.Err(); err != nil {
log.Fatal(err)
}
cur.Close(context.TODO())
結果のドキュメント数が多い場合、Skip
とLimit
を使用してページングを実装することができます。
詳細な設定方法は公式ドキュメントを参照してください。
findOptions.SetLimit(5)
findOptions.SetSkip(10)
ここでは、Goの構造体を使ってデータを追加していきます。
MongoDBのドライバでは、「bson」タグを使って構造体のフィールドとMongoDBのドキュメントフィールドのマッピングを行います。
これにより、構造体のフィールド名とドキュメントのフィールド名が異なる場合でも、正しくマッピングすることができます。
単一のドキュメントを追加するにはInsertOne
メソッドを使用します。
詳細な設定方法は公式ドキュメントを参照してください。
type User struct {
Name string `bson:"name"`
Age int `bson:"age"`
}
document := User{
Name: "John Doe",
Age: 25,
}
insertResult, err := collection.InsertOne(context.TODO(), document)
if err != nil {
log.Fatal(err)
}
fmt.Println("Inserted a Single Document: ", insertResult.InsertedID)
複数のドキュメントを追加するにはInsertMany
メソッドを使用します。
詳細な設定方法は公式ドキュメントを参照してください。
documents := []interface{}{
User{Name: "John Doe", Age: 25},
User{Name: "Jane Doe", Age: 28},
}
insertManyResult, err := collection.InsertMany(context.TODO(), documents)
if err != nil {
log.Fatal(err)
}
fmt.Println("Inserted multiple documents: ", insertManyResult.InsertedIDs)
単一のドキュメントを更新するにはUpdateOne
メソッドを使用します。
詳細な設定方法は公式ドキュメントを参照してください。
filter := bson.D{{"name", "John Doe"}}
update := bson.D{
{"$set", bson.D{
{"age", 26},
}},
}
updateResult, err := collection.UpdateOne(context.TODO(), filter, update)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Matched %v documents and updated %v documents.\n", updateResult.MatchedCount, updateResult.ModifiedCount)
複数のドキュメントを更新するにはUpdateMany
メソッドを使用します。
詳細な設定方法は公式ドキュメントを参照してください。
filter := bson.M{"age": bson.M{"$gt": 25}}
update := bson.D{
{"$inc", bson.D{
{"age", 1},
}},
}
updateResult, err := collection.UpdateMany(context.TODO(), filter, update)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Matched %v documents and updated %v documents.\n", updateResult.MatchedCount, updateResult.ModifiedCount)
条件にマッチしたドキュメントを検索し、最初のドキュメントを更新するにはfindOneAndUpdate
メソッドを使用します。
詳細な設定方法は公式ドキュメントを参照してください。
opts := options.FindOneAndUpdate().SetReturnDocument(options.After)
filter := bson.D{{"name", "John Doe"}}
update := bson.D{{"$inc", bson.D{{"age", 1}}}}
var updatedDocument bson.M
err := collection.FindOneAndUpdate(context.TODO(), filter, update, opts).Decode(&updatedDocument)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Updated document %v\n", updatedDocument)
単一のドキュメントを削除するにはDeleteOne
メソッドを使用します。
詳細な設定方法は公式ドキュメントを参照してください。
deleteFilter := bson.D{{"name", "John Doe"}}
deleteResult, err := collection.DeleteOne(context.TODO(), deleteFilter)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Deleted %v documents in the trainers collection\n", deleteResult.DeletedCount)
複数のドキュメントを削除するにはDeleteMany
メソッドを使用します。
詳細な設定方法は公式ドキュメントを参照してください。
filter := bson.M{"age": bson.M{"$gt": 25}}
deleteResult, err := collection.DeleteMany(context.TODO(), filter)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Deleted %v documents in the trainers collection\n", deleteResult.DeletedCount)
MongoDB 4.0以降、複数の操作を一つのトランザクションとして扱うことができます。
詳細な設定方法は公式ドキュメントを参照してください。
session, err := client.StartSession()
if err != nil {
log.Fatal(err)
}
defer session.EndSession(context.TODO())
callback := func(sessionContext mongo.SessionContext) (interface{}, error) {
// perform operations....
return nil, nil
}
_, err = session.WithTransaction(context.TODO(), callback)
if err != nil {
log.Fatal(err)
}
MongoDBドライバーで提供されているbson.D
とbson.M
はどちらもBSONドキュメントを表すための型ですが、それぞれが異なる目的と利用シーンを持っています。
bson.D
は順序を保持したドキュメントを表します。bson.D
は[]primitive.E
のエイリアスで、primitive.E
はフィールド名と値をペアで持つ構造体です。
これにより、フィールドの順序が重要な操作(例えば、アップデートの操作でフィールドの削除と追加を順序を保持して行いたい場合)にbson.D
を使用します。
bson.D{{"name", "John Doe"}, {"age", 30}}
bson.M
は順序を保持しないマップを表します。Goの標準マップのエイリアスで、map[string]interface{}
型となっています。
フィールドの順序が問題とならない場合(例えば、クエリフィルタや結果の取得)にはbson.M
を使用します。
bson.M{"name": "John Doe", "age": 30}
以上がGo言語を使ってMongoDBのデータ操作を行う方法についての解説です。
この記事があなたのMongoDBとGo言語に対する理解を深める一助となれば幸いです。
Querier運営
「Querier(クエリア)」は社内向け管理画面を圧倒的な速さで、かつビジネスのスケールに合わせて柔軟に構築することができるローコードツールです。
このたび2024年11月11日に値の参照に関する仕様変更を予定しておりますので詳細について報告いたします。
more
データフローの通知設定機能・監査ログへのパラメータが追加されましたのでご紹介します。
more
データフローのアクションに永続化などに利用できるローカルストレージ機能を追加しました。
more
日本を健康に。多彩なフィットネスブランドを展開中。スタジオ付きの「JOYFIT」、24時間型の「JOYFIT24」、ヨガスタジオ「JOYFIT YOGA」、パーソナルジム「JOYFIT+」、家族向けの「FIT365」など、多彩なブランド展開で全国を席巻しているスポーツ事業。
more
管理画面の構築もWeb上で完結
エンジニアのためのローコードツール