カーソルからデータにアクセスする
Overview
このガイドでは、カーソルを使用してデータにアクセスする方法を学びます。
カーソルは、アプリケーションがデータベースの結果を反復処理しながら、特定の時点でメモリ内に結果のサブセットのみを保持できるようにするメカニズムです。 複数のドキュメントに一致する読み取り操作では、カーソルを使用して、それらのドキュメントを一度にではなくバッチで返します。
サンプル カーソル
各セクションでは、次の cursor
変数を使用します。これは、コレクション内のすべてのドキュメントを含む Cursor
構造体です。
cursor, err := coll.Find(context.TODO(), bson.D{}) if err != nil { panic(err) }
重要
カーソルは、 goroutine セーフではありません。 複数の goroutine で同時に同じカーソルを使用しないでください。
ドキュメントを個別に検索する
現在のゴルーチンをブロックしながらカーソルからドキュメントを個別に検索するには、Next()
メソッドを使用します。
このメソッドは、次の各条件が true である場合、ドキュメントを返します。
ドキュメントは現在利用可能であるか、または今後利用可能になります
エラーは発生しませんでした
コンテキストは期限切れになりませんでした
for cursor.Next(context.TODO()) { var result bson.D if err := cursor.Decode(&result); err != nil { log.Fatal(err) } fmt.Println(result) } if err := cursor.Err(); err != nil { log.Fatal(err) }
追尾可能 (tailable) カーソル
追尾可能 ( tailable) カーソルからドキュメントを検索するには、 TryNext()
メソッドを使用します。
このメソッドは、次の各条件が true である場合、ドキュメントを返します。
ドキュメントは現在利用可能
エラーは発生しませんでした
コンテキストは期限切れになりませんでした
for { if cursor.TryNext(context.TODO()) { var result bson.D if err := cursor.Decode(&result); err != nil { log.Fatal(err) } fmt.Println(result) continue } if err := cursor.Err(); err != nil { log.Fatal(err) } if cursor.ID() == 0 { break } }
すべてのドキュメントを検索する
すべてのクエリ結果を配列に取り込むには、All()
メソッドを使用します。
var results []bson.D if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { fmt.Println(result) }
重要
メモリ
クエリによって返されたドキュメントの数とサイズが利用可能なアプリケーション メモリを超えると、プログラムはクラッシュします。 大規模な結果セットを除く場合は、カーソルを反復的に消費する必要があります。
カーソルを閉じる
アプリケーションでカーソルが不要になったら、 Close()
メソッドを使用してカーソルを閉じます。 このメソッドは、クライアント アプリケーションと MongoDB サーバーの両方でカーソルが消費するリソースを解放します。
defer cursor.Close(context.TODO())
注意
ドキュメントを個別に検索するときは、カーソルを閉じます。これらのメソッドはカーソルを追尾可能にするためです。
詳細情報
このガイドで説明した操作の詳細については、次のガイドを参照してください。
API ドキュメント
カーソルとその要素にアクセスする方法について詳しくは、次の API ドキュメントを参照してください。