クエリーとカーソル

based on 18

モード

コレクション上に対する 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カーソルとスナップショット

A latent cursor has (in addition to an initial access) a latent access that occurs after an intervening write operation on the database collection (i.e., an insert, update, or delete).

多くの状況で、データベースはこれらの操作をサポートします。

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

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

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

確保されているカーソルの情報は、 {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