Docs Menu
Docs Home
/ / /
Go
/ / /

カーソルからデータにアクセスする

項目一覧

  • Overview
  • サンプル カーソル
  • ドキュメントを個別に検索する
  • 追尾可能 (tailable) カーソル
  • すべてのドキュメントを検索する
  • カーソルを閉じる
  • 詳細情報
  • API ドキュメント

このガイドでは、カーソルを使用してデータにアクセスする方法を学びます。

カーソルは、アプリケーションがデータベースの結果を反復処理しながら、特定の時点でメモリ内に結果のサブセットのみを保持できるようにするメカニズムです。複数のドキュメントに一致する読み取り操作では、カーソルを使用して、それらのドキュメントを一度にではなくバッチで返します。

各セクションでは、次の cursor 変数を使用します。これは、コレクション内のすべてのドキュメントを含む Cursor 構造体です。

cursor, err := coll.Find(context.TODO(), bson.D{})
if err != nil {
panic(err)
}

このガイドの例では、ドライバーは、cursor 変数に保持されているドキュメントをサンプルの MyStruct 構造体にアンマーシャリングします。

重要

カーソルは、goroutine セーフではありません。複数の goroutine で同時に同じカーソルを使用しないでください。

現在のゴルーチンをブロックしながらカーソルからドキュメントを個別に検索するには、Next() メソッドを使用します。

このメソッドでは、次の条件がすべて満たされた場合にドキュメントが返されます。

  • ドキュメントは現在利用可能であるか、または今後利用可能になります。

  • ドライバーはエラーをスローしませんでした。

  • コンテキストは期限切れになりませんでした。

for cursor.Next(context.TODO()) {
var result MyStruct
if err := cursor.Decode(&result); err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", result)
}
if err := cursor.Err(); err != nil {
log.Fatal(err)
}

追尾可能 (tailable) カーソルからドキュメントを検索するには、TryNext() メソッドを使用します。

このメソッドでは、次の条件がすべて満たされた場合にドキュメントが返されます。

  • ドキュメントは現在利用可能です。

  • ドライバーはエラーをスローしませんでした。

  • コンテキストは期限切れになりませんでした。

for {
if cursor.TryNext(context.TODO()) {
var result MyStruct
if err := cursor.Decode(&result); err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", result)
continue
}
if err := cursor.Err(); err != nil {
log.Fatal(err)
}
if cursor.ID() == 0 {
break
}
}

すべてのクエリ結果を配列に取り込むには、All() メソッドを使用します。

var results []MyStruct
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
fmt.Printf("%+v\n", result)
}

重要

メモリ

クエリによって返されたドキュメントの数とサイズが利用可能なアプリケーション メモリを超えると、プログラムはクラッシュします。 大規模な結果セットを除く場合は、カーソルを反復的に消費する必要があります。

アプリケーションでカーソルが不要になったら、 Close()メソッドを使用してカーソルを閉じます。 このメソッドは、クライアント アプリケーションと MongoDB サーバーの両方でカーソルが消費するリソースを解放します。

defer cursor.Close(context.TODO())

注意

ドキュメントを個別に検索する場合は、カーソルを閉じてください。これらのメソッドにより、カーソルが末尾可能になるためです。

このガイドで説明した操作の詳細については、次のガイドを参照してください。

  • Retrieve Data

  • クエリを指定する

  • BSON との連携

  • テール可能カーソル

カーソルとその要素にアクセスする方法について詳しくは、次の API ドキュメントを参照してください。

戻る

Retrieve Data