クエリーとカーソル

based on 21 (2010-10-04更新) - オリジナル

MongoDBのクエリはカーソルを返します。そして、取得したカーソルで結果をイテレートすることができます。クエリの正しい方法は言語のドライバによって変わります。下記の詳細は、 MongoDBシェル からの実行(つまり mongo プロセス)に焦点を当てています。

シュルの find() メソッドはカーソルオブジェクトを返し、結果のドキュメントをイテレートすることができます。 このために、 hasNext()next() メソッドを使います。

for( var c = db.parts.find(); c.hasNext(); ) { 
  print( c.next()); 
}

加えて、シェルの中では、 forEach() をカーソルと使うことができます。

db.users.find().forEach( function(u) { print("user: " + u.name); } );

シェルの中で配列モード

JavaScriptなどのいくつかの言語では、ドライバは"配列モード"をサポートしています。詳しくはドライバードキュメントを確認してください。

シェルでは、カーソルを配列モードで使うために、配列のインデックス [] 操作と、 length プロパティを使います。

配列モードでは、インデックスで要求された値までのすべてのデータを、RAMにロードします。そのためとても大きな量のデータを返すようなクエリに対しては 使わない でください。out of memory になってしまいます。

また、カーソルに対し toArray() を呼ぶこともできます。 toArray() はすべてのオブジェクトをRAMにロードします。

1つのアイテムの取得

1つのアイテムを取得するためには、 findOne() を使います。一つも見つからない場合には Null が返されます。

findOne() は以下の等価と等化です。

function findOne(coll, query) {
  var cursor = coll.find(query).limit(1);
  return cursor.hasNext() ? cursor.next() : null;
}

Tip: マッチした複数行に対して一つだけ必要な場合、 findOne() は、 limit() 操作を実行し、結果を制限するので効率的です。

組み込みオブジェクトに対するクエリー

組み込みオブジェクト全体に完全にマッチするものを探すのは、単純に、

db.order.find( { shipping: { carrier: "usps" } } ); 

このクエリーでは、shipping オブジェクト内に含まれる { carrier: "usps" } と完全にマッチするのみが該当します。 shipping.carrier == "usps" にマッチするサブオブジェクトすべてを取得したい場合には、以下の文法を使ってください。

db.order.find( { "shipping.carrier" : "usps" } ); 

詳しい情報は、 ドット表記 ドキュメントを参照してください。

大きい、小さい (Greater Than / Less Than)

db.myCollection.find( { a : { $gt : 3 } } ); 
db.myCollection.find( { a : { $gte :3 } } ); 
db.myCollection.find( { a : { $lt :3 } } ); 
db.myCollection.find( { a : { $lte :3 } } ); // a <= 3 

latentカーソルとスナップショット

latentカーソルは (最初のアクセスからの) データベースに対する書き込み操作(insert/update/delete)が影響します。多くの状況で、データベースはこれらの操作をサポートします。

概念的に、カーソルは現在のポジションを持っています。現在のポジションのアイテムが削除された場合には、カーソルは自動的に次のアイテムへ進みます。

MongoDBのカーソルはスナップショットではありません。他の書き込みがカーソルが存在している間に発生した場合、その書き込みがカーソルに現れるかもしれませんし、現れないかもしれません。 詳しい情報は、 snapshot を参照してください。

確保されているカーソルのチェック

確保されているカーソルの情報は、 {cursorInfo:1} コマンドで取得することができます。

db.runCommand({cursorInfo:1})

参照


Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.

IF YOU HAVE A QUESTION, POST IT TO THE USER GROUP.

These pages are fine for comments, but for questions, your best bet will always be the MongoDB User Group.

blog comments powered by Disqus