Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/ / /
Go Driver
/ /

Retrieve Distinct Values

このガイドでは、単一のコレクション全体で指定されたフィールドの個別の値を取得する方法を学習できます。

このガイドの例では、courses コレクション内のドキュメントのモデルとして次の Course 構造体を使用しています。

type Course struct {
Title string
Department string
Enrollment int32
}

例えを実行するには、次のスニペットを使用してサンプルデータをdb.coursesコレクションにロードします。

coll := client.Database("db").Collection("courses")
docs := []interface{}{
Course{Title: "World Fiction", Department: "English", Enrollment: 35},
Course{Title: "Abstract Algebra", Department: "Mathematics", Enrollment: 60},
Course{Title: "Modern Poetry", Department: "English", Enrollment: 12},
Course{Title: "Plate Tectonics", Department: "Geology", Enrollment: 30},
}
result, err := coll.InsertMany(context.TODO(), docs)

Tip

存在しないデータベースとコレクション

書き込み操作を実行するときに必要なデータベースとコレクションが存在しない場合は、サーバーが暗黙的にそれらを作成します。

各ドキュメントには、コース名、部門、登録者数を含む大学コースの説明が含まれています。 これらの項目は、各ドキュメントのtitledepartmentenrollmentフィールドに対応します。

単一のコレクション全体で指定されたフィールドの個別の値を検索するには、次のパラメータをDistinct()メソッドに渡します。

  • 個別の値を取得するフィールド名

  • 一致するドキュメントを指定するnon-nilクエリフィルター

Tip

空のクエリフィルターを指定すると、 Distinct()メソッドはコレクション内のすべてのドキュメントにわたって個別の値を検索します。

DistinctOptionsを渡すことで、 Distinct()メソッドの動作を変更できます。 DistinctOptionsを指定しない場合、ドライバーは各オプションのデフォルト値を使用します。

DistinctOptions タイプでは、次の方法でオプションを設定できます。

方式
説明

SetCollation()

The type of language collation to use when sorting results.
Default: nil

SetComment()

Sets a comment to attach to the distinct operation.
Default: nil

次の例では、 enrollmentフィールドの値が 50 より小さいドキュメントを検索し、Distinct() メソッドを使用して departmentフィールドの個別の値を出力します。

filter := bson.D{{"enrollment", bson.D{{"$lt", 50}}}}
var arr []string
err = coll.Distinct(context.TODO(), "department", filter).Decode(&arr)
if err != nil {
panic(err)
}
fmt.Printf("%s\n", arr)
[English Geology]

注意

セットアップ例

この例では、接続 URI を使用してMongoDBのインスタンスに接続します。MongoDBインスタンスへの接続の詳細については、「 MongoClient の作成ガイド 」を参照してください。この例では、 Atlasサンプルデータセット に含まれる sample_restaurantsデータベースの restaurantsコレクションも使用します。Atlas を使い始める」ガイドに従って、 MongoDB Atlasの無料階層のデータベースにロードできます。

この例では、 restaurantコレクションに対して次のアクションを実行しています。

  • cuisineフィールドの値が "Tapas" であるドキュメントに一致します

  • 一致したドキュメントから boroughフィールドの個別の値を返します

// Retrieves distinct values of a field by using the Go driver
package main
import (
"context"
"fmt"
"log"
"os"
"github.com/joho/godotenv"
"go.mongodb.org/mongo-driver/v2/bson"
"go.mongodb.org/mongo-driver/v2/mongo"
"go.mongodb.org/mongo-driver/v2/mongo/options"
)
type Restaurant struct {
ID bson.ObjectID `bson:"_id"`
Name string
RestaurantId string `bson:"restaurant_id"`
Cuisine string
Address interface{}
Borough string
Grades interface{}
}
func main() {
if err := godotenv.Load(); err != nil {
log.Println("No .env file found")
}
var uri string
if uri = os.Getenv("MONGODB_URI"); uri == "" {
log.Fatal("You must set your 'MONGODB_URI' environment variable. See\n\t https://www.mongodb.com/ja-jp/docs/drivers/go/current/usage-examples/#environment-variable")
}
client, err := mongo.Connect(options.Client().ApplyURI(uri))
if err != nil {
panic(err)
}
defer func() {
if err = client.Disconnect(context.TODO()); err != nil {
panic(err)
}
}()
// Filters the collection for documents where the value of cuisine is "Tapas"
coll := client.Database("sample_restaurants").Collection("restaurants")
filter := bson.D{{"cuisine", "Tapas"}}
// Retrieves the distinct values of the "borough" field in documents
// that match the filter
var arr []string
err = coll.Distinct(context.TODO(), "borough", filter).Decode(&arr)
if err != nil {
panic(err)
}
// Prints the distinct "borough" values
for _, result := range arr {
fmt.Println(result)
}
// When you run this file, it should print:
// Brooklyn
// Manhattan
// Queens
}
Brooklyn
Manhattan
Queens

クエリフィルターの作成の詳細については、「クエリの指定 」を参照してください。

このガイドで説明したメソッドや型の詳細については、次の API ドキュメントを参照してください。

戻る

ドキュメントをカウント

項目一覧