|
based on v35 (2010/08/22 追従) データベースの取得まず最初に、あなたの環境で動かせるように Quickstart ガイドを読んでください。 データベースコネクションの取得データベース シェル を使って、データベースを操作してみましょう。(同じような操作を driver 使うことで、どのプログラム言語から行うことができます。 このシェルは、対話的に管理用で使うのに便利です。) MongoDBのJavaScriptシェルを起動します。 $ bin/mongo デフォルトでは、localhostの"test"データベースへ接続します。 MongoDB shell version: <whatever> url: test connecting to: test type "help" for help > "connecting to:" 接続されているデータベース名が表示されます。データベースを変更するためには、以下のようにします。 > use mydb switched to db mydb コマンドのリストを見るには、 help をタイプします。
データをコレクションへ挿入テスト用のコレクションを作成し、データを入れてみましょう。二つのオブジェクト j と t を作ります。そしてそれを things というコレクションにセーブします。 下記の例では、'>' 以降はシェルプロンプトでタイプされたコマンドを意味します。 > j = { name : "mongo" };
{"name" : "mongo"}
> t = { x : 3 };
{ "x" : 3 }
> db.things.save(j);
> db.things.save(t);
> db.things.find();
{ "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }
{ "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 }
>
いくつかの注意事項 :
もう少しレコードをコレクションに追加してみましょう。 > for (var i = 1; i <= 20; i++) db.things.save({x : 4, j : i}); > db.things.find(); { "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" } { "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 } { "_id" : ObjectId("4c220a42f3924d31102bd856"), "x" : 4, "j" : 1 } { "_id" : ObjectId("4c220a42f3924d31102bd857"), "x" : 4, "j" : 2 } { "_id" : ObjectId("4c220a42f3924d31102bd858"), "x" : 4, "j" : 3 } { "_id" : ObjectId("4c220a42f3924d31102bd859"), "x" : 4, "j" : 4 } { "_id" : ObjectId("4c220a42f3924d31102bd85a"), "x" : 4, "j" : 5 } { "_id" : ObjectId("4c220a42f3924d31102bd85b"), "x" : 4, "j" : 6 } { "_id" : ObjectId("4c220a42f3924d31102bd85c"), "x" : 4, "j" : 7 } { "_id" : ObjectId("4c220a42f3924d31102bd85d"), "x" : 4, "j" : 8 } { "_id" : ObjectId("4c220a42f3924d31102bd85e"), "x" : 4, "j" : 9 } { "_id" : ObjectId("4c220a42f3924d31102bd85f"), "x" : 4, "j" : 10 } { "_id" : ObjectId("4c220a42f3924d31102bd860"), "x" : 4, "j" : 11 } { "_id" : ObjectId("4c220a42f3924d31102bd861"), "x" : 4, "j" : 12 } { "_id" : ObjectId("4c220a42f3924d31102bd862"), "x" : 4, "j" : 13 } { "_id" : ObjectId("4c220a42f3924d31102bd863"), "x" : 4, "j" : 14 } { "_id" : ObjectId("4c220a42f3924d31102bd864"), "x" : 4, "j" : 15 } { "_id" : ObjectId("4c220a42f3924d31102bd865"), "x" : 4, "j" : 16 } { "_id" : ObjectId("4c220a42f3924d31102bd866"), "x" : 4, "j" : 17 } { "_id" : ObjectId("4c220a42f3924d31102bd867"), "x" : 4, "j" : 18 } has more ノート: 全部のドキュメントが表示されません。これは、このシェルは出力が20件に制限されているからです。2つのドキュメントがコレクションの中に既にあったので、新しく作成されたドキュメントのうち18個だけが表示されます。 さらに次の結果を見るために、 it ショートカットコマンドがあります。上記の続きです。 { "_id" : ObjectId("4c220a42f3924d31102bd866"), "x" : 4, "j" : 17 }
{ "_id" : ObjectId("4c220a42f3924d31102bd867"), "x" : 4, "j" : 18 }
has more
> it
{ "_id" : ObjectId("4c220a42f3924d31102bd868"), "x" : 4, "j" : 19 }
{ "_id" : ObjectId("4c220a42f3924d31102bd869"), "x" : 4, "j" : 20 }
技術的に、find() はカーソルオブジェクトを返します。しかしこのケースでは、返されたカーソルを変数にセットしていません。この場合、シェルは自動的にカーソルをイテレートし、最初のリザルトセットを返します。また、 it コマンドによりイテレートを続けます。 しかし、カーソルを直接扱うこともできます。次のセクションで見ていきましょう。 クエリーでデータアクセスまず、クエリーについて深く入る前に、クエリーの結果であるカーソルオブジェクトについて説明します。まず find() メソッドを使います。これはコレクションのすべてを返すものです。その後、個別のクエリーについて説明します。 mongo shell を使用中に、コレクションのすべての要素を見るためには、 find() が返すカーソルを使う必要があります。 同じクエリーを繰り返してみましょう。ただし、今回は find() が返すカーソルを使い、whileループでイテレートします。 > var cursor = db.things.find(); > while (cursor.hasNext()) printjson(cursor.next()); { "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" } { "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 } { "_id" : ObjectId("4c220a42f3924d31102bd856"), "x" : 4, "j" : 1 } { "_id" : ObjectId("4c220a42f3924d31102bd857"), "x" : 4, "j" : 2 } { "_id" : ObjectId("4c220a42f3924d31102bd858"), "x" : 4, "j" : 3 } { "_id" : ObjectId("4c220a42f3924d31102bd859"), "x" : 4, "j" : 4 } { "_id" : ObjectId("4c220a42f3924d31102bd85a"), "x" : 4, "j" : 5 } { "_id" : ObjectId("4c220a42f3924d31102bd85b"), "x" : 4, "j" : 6 } { "_id" : ObjectId("4c220a42f3924d31102bd85c"), "x" : 4, "j" : 7 } { "_id" : ObjectId("4c220a42f3924d31102bd85d"), "x" : 4, "j" : 8 } { "_id" : ObjectId("4c220a42f3924d31102bd85e"), "x" : 4, "j" : 9 } { "_id" : ObjectId("4c220a42f3924d31102bd85f"), "x" : 4, "j" : 10 } { "_id" : ObjectId("4c220a42f3924d31102bd860"), "x" : 4, "j" : 11 } { "_id" : ObjectId("4c220a42f3924d31102bd861"), "x" : 4, "j" : 12 } { "_id" : ObjectId("4c220a42f3924d31102bd862"), "x" : 4, "j" : 13 } { "_id" : ObjectId("4c220a42f3924d31102bd863"), "x" : 4, "j" : 14 } { "_id" : ObjectId("4c220a42f3924d31102bd864"), "x" : 4, "j" : 15 } { "_id" : ObjectId("4c220a42f3924d31102bd865"), "x" : 4, "j" : 16 } { "_id" : ObjectId("4c220a42f3924d31102bd866"), "x" : 4, "j" : 17 } { "_id" : ObjectId("4c220a42f3924d31102bd867"), "x" : 4, "j" : 18 } { "_id" : ObjectId("4c220a42f3924d31102bd868"), "x" : 4, "j" : 19 } { "_id" : ObjectId("4c220a42f3924d31102bd869"), "x" : 4, "j" : 20 } 上記のコードはカーソルタイプのイテレーションです。 hasNext() ファンクションはさらにドキュメントがあるかどうかを返し、 next() ファンクションは次のドキュメントを返します。また、build-in である tojson() メソッドを使いドキュメントをJSONスタイルのフォーマットで表示しています。 JavaScriptの shell 内にいるとき、Javascriptの機能を使うことができ、 forEach をカーソルに対し実行することができます。上記の例を、whileループではなく、 forEach() を使用し実行してみます。 > db.things.find().forEach(printjson);
{ "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }
{ "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 }
{ "_id" : ObjectId("4c220a42f3924d31102bd856"), "x" : 4, "j" : 1 }
{ "_id" : ObjectId("4c220a42f3924d31102bd857"), "x" : 4, "j" : 2 }
{ "_id" : ObjectId("4c220a42f3924d31102bd858"), "x" : 4, "j" : 3 }
{ "_id" : ObjectId("4c220a42f3924d31102bd859"), "x" : 4, "j" : 4 }
{ "_id" : ObjectId("4c220a42f3924d31102bd85a"), "x" : 4, "j" : 5 }
{ "_id" : ObjectId("4c220a42f3924d31102bd85b"), "x" : 4, "j" : 6 }
{ "_id" : ObjectId("4c220a42f3924d31102bd85c"), "x" : 4, "j" : 7 }
{ "_id" : ObjectId("4c220a42f3924d31102bd85d"), "x" : 4, "j" : 8 }
{ "_id" : ObjectId("4c220a42f3924d31102bd85e"), "x" : 4, "j" : 9 }
{ "_id" : ObjectId("4c220a42f3924d31102bd85f"), "x" : 4, "j" : 10 }
{ "_id" : ObjectId("4c220a42f3924d31102bd860"), "x" : 4, "j" : 11 }
{ "_id" : ObjectId("4c220a42f3924d31102bd861"), "x" : 4, "j" : 12 }
{ "_id" : ObjectId("4c220a42f3924d31102bd862"), "x" : 4, "j" : 13 }
{ "_id" : ObjectId("4c220a42f3924d31102bd863"), "x" : 4, "j" : 14 }
{ "_id" : ObjectId("4c220a42f3924d31102bd864"), "x" : 4, "j" : 15 }
{ "_id" : ObjectId("4c220a42f3924d31102bd865"), "x" : 4, "j" : 16 }
{ "_id" : ObjectId("4c220a42f3924d31102bd866"), "x" : 4, "j" : 17 }
{ "_id" : ObjectId("4c220a42f3924d31102bd867"), "x" : 4, "j" : 18 }
{ "_id" : ObjectId("4c220a42f3924d31102bd868"), "x" : 4, "j" : 19 }
{ "_id" : ObjectId("4c220a42f3924d31102bd869"), "x" : 4, "j" : 20 }
この forEach() を使った例では、カーソル内の各ドキュメントに対して呼ばれるfunctionを定義する必要があります。 mongo shell 内では、カーソルをarrayのようにも使えます。 > var cursor = db.things.find(); > printjson(cursor[4]); { "_id" : ObjectId("4c220a42f3924d31102bd858"), "x" : 4, "j" : 3 } この方法でカーソルを使った場合、アクセスされたところまで(上記の例ではカーソル[4]])までのすべてのドキュメントがメモリにロードされることに注意してください。これは大きなリザルトセットを扱う場合好ましくありません。大量の結果を扱うときにはどんなクエリーでもカーソルを使うべきでしょう。 上記のカーソルに対するarrayスタイルでのアクセス方法に加え、カーソルを正真正銘のarrayにコンバートすることもできます。 > var arr = db.things.find().toArray(); > arr[5]; {"name" : "mongo" , "_id" : ObjectId("497cf60751712cf7758fbdbb")} これらのarrayに関する機能は mongo - The Interactive Shell でのみ使えることに注意してください。その他のドライバーでは使用できません。 MongoDB のカーソルはスナップショットではありません。最初と最後の next() の間に、あなたや他の人がした操作は、作成されたカーソルによって返されるかもしないし、返されないかもしれません。スナップショットなクエリーを実行するためには明確なロックを使ってください。 クエリーが何を返すか指定するクエリーによって返されたカーソルオブジェクトがどのように動くがわかったので、次は色々なクエリーの作り方です。 クエリーを作るということは、マッチするkeyとvalueの組を指す"クエリー ドキュメント"というドキュメントのを作ることを意味します。 以下は簡単な例です。例に続いて、SQLクエリーのサンプルを提示します。そして、mongo shellを用いて、どうやって同じクエリーを表すのかを提示します。 このクエリーの方法は、MongoDBの基本的なもんおなので、どのドライバーや言語からでも同じ方法が使えます。 SELECT * FROM things WHERE name="mongo" > db.things.find({name:"mongo"}).forEach(printjson);
{ "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }
SELECT * FROM things WHERE x=4 > db.things.find({x:4}).forEach(printjson);
{ "_id" : ObjectId("4c220a42f3924d31102bd856"), "x" : 4, "j" : 1 }
{ "_id" : ObjectId("4c220a42f3924d31102bd857"), "x" : 4, "j" : 2 }
{ "_id" : ObjectId("4c220a42f3924d31102bd858"), "x" : 4, "j" : 3 }
{ "_id" : ObjectId("4c220a42f3924d31102bd859"), "x" : 4, "j" : 4 }
{ "_id" : ObjectId("4c220a42f3924d31102bd85a"), "x" : 4, "j" : 5 }
{ "_id" : ObjectId("4c220a42f3924d31102bd85b"), "x" : 4, "j" : 6 }
{ "_id" : ObjectId("4c220a42f3924d31102bd85c"), "x" : 4, "j" : 7 }
{ "_id" : ObjectId("4c220a42f3924d31102bd85d"), "x" : 4, "j" : 8 }
{ "_id" : ObjectId("4c220a42f3924d31102bd85e"), "x" : 4, "j" : 9 }
{ "_id" : ObjectId("4c220a42f3924d31102bd85f"), "x" : 4, "j" : 10 }
{ "_id" : ObjectId("4c220a42f3924d31102bd860"), "x" : 4, "j" : 11 }
{ "_id" : ObjectId("4c220a42f3924d31102bd861"), "x" : 4, "j" : 12 }
{ "_id" : ObjectId("4c220a42f3924d31102bd862"), "x" : 4, "j" : 13 }
{ "_id" : ObjectId("4c220a42f3924d31102bd863"), "x" : 4, "j" : 14 }
{ "_id" : ObjectId("4c220a42f3924d31102bd864"), "x" : 4, "j" : 15 }
{ "_id" : ObjectId("4c220a42f3924d31102bd865"), "x" : 4, "j" : 16 }
{ "_id" : ObjectId("4c220a42f3924d31102bd866"), "x" : 4, "j" : 17 }
{ "_id" : ObjectId("4c220a42f3924d31102bd867"), "x" : 4, "j" : 18 }
{ "_id" : ObjectId("4c220a42f3924d31102bd868"), "x" : 4, "j" : 19 }
{ "_id" : ObjectId("4c220a42f3924d31102bd869"), "x" : 4, "j" : 20 }
このクエリはドキュメントそのものです。{ a:A, b:B, ... }という形のクエリー ドキュメントは、"where a==A and b==B and ..."という意味です。 Mongo Developers' Guide の Queries and cursors にクエリについての詳しい情報があります。 MongoDBは、"部分的なドキュメント"も返します。これは、データベースに保存されたドキュメントを部分的に持つものです。 find() クエリーの2個目の引数を設定すると、引数で指定したエレメントが返されます。 どういうことか説明するために、先程の find({x:4}) の例に、"j" エレメントだけを返すような引数を追加して実行してみましょう。 SELECT j FROM things WHERE x=4 > db.things.find({x:4}, {j:true}).forEach(printjson);
{ "_id" : ObjectId("4c220a42f3924d31102bd856"), "j" : 1 }
{ "_id" : ObjectId("4c220a42f3924d31102bd857"), "j" : 2 }
{ "_id" : ObjectId("4c220a42f3924d31102bd858"), "j" : 3 }
{ "_id" : ObjectId("4c220a42f3924d31102bd859"), "j" : 4 }
{ "_id" : ObjectId("4c220a42f3924d31102bd85a"), "j" : 5 }
{ "_id" : ObjectId("4c220a42f3924d31102bd85b"), "j" : 6 }
{ "_id" : ObjectId("4c220a42f3924d31102bd85c"), "j" : 7 }
{ "_id" : ObjectId("4c220a42f3924d31102bd85d"), "j" : 8 }
{ "_id" : ObjectId("4c220a42f3924d31102bd85e"), "j" : 9 }
{ "_id" : ObjectId("4c220a42f3924d31102bd85f"), "j" : 10 }
{ "_id" : ObjectId("4c220a42f3924d31102bd860"), "j" : 11 }
{ "_id" : ObjectId("4c220a42f3924d31102bd861"), "j" : 12 }
{ "_id" : ObjectId("4c220a42f3924d31102bd862"), "j" : 13 }
{ "_id" : ObjectId("4c220a42f3924d31102bd863"), "j" : 14 }
{ "_id" : ObjectId("4c220a42f3924d31102bd864"), "j" : 15 }
{ "_id" : ObjectId("4c220a42f3924d31102bd865"), "j" : 16 }
{ "_id" : ObjectId("4c220a42f3924d31102bd866"), "j" : 17 }
{ "_id" : ObjectId("4c220a42f3924d31102bd867"), "j" : 18 }
{ "_id" : ObjectId("4c220a42f3924d31102bd868"), "j" : 19 }
{ "_id" : ObjectId("4c220a42f3924d31102bd869"), "j" : 20 }
ノート: "_id" は常に返されます。 findOne() - シンタックスシュガー利便のため、mongo shell (と他のドライバーも)では、カーソルを扱う手間を避けるために、ただ取得した1ドキュメントだけを、findOne() ファンクション経由で取得できます。 findOne() は find() ファンクションと同じ引数をとります。しかし、カーソルを返す代わりに、最初のドキュメント、またはドキュメントが見つからない場合には、 null を返します。 例として、 name=='mongo' という条件で1ドキュメントだけ取得してみましょう。単に カーソルの next() を呼ぶ方法(もちろん null チェックをした後)や、カーソルとarrayとして扱い0番目の要素を取る方法など、これにはたくさんの方法があります。 しかし、 findOne() は、便利で効率的です。 > printjson(db.things.findOne({name:"mongo"}));
{ "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }
クライアントは、1つのオブジェクトだけをデータベースに要求するので、データべベース、ネットワーク双方で効率的です。 また、 find({name:"mongo"}).limit(1) と同じです。 limit() を使い結果を制限limit() を使うことにより、クエリーの結果の最大数を制限することができます。 これは、データベースや、ネットワークの使用量が減るので、パフォーマンスのためにとても推奨されます。 > db.things.find().limit(3);
{ "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }
{ "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 }
{ "_id" : ObjectId("4c220a42f3924d31102bd856"), "x" : 4, "j" : 1 }
その他のhelp通常の"help"コマンドに加えて、 db と db.なんでも に対してhelpを呼ぶことで、メソッドのサマリーを見ることができます。 また、あるファンクションが何をするか、ということを知りたい場合には、 () なしでタイプすることで、ソースを表示することができます。たとえば、 > printjson
function (x) {
print(tojson(x));
}
mongo は、完全なJavaScriptシェルなので、どのJavaScriptのファンクション、文法、クラスをシェルの中で使うことができます。加えて、MongoDBは独自のクラスやglobal変数(例えば、 db)を定義しています。 http://api.mongodb.org/js/ ですべてのAPIを見ることができます。 次はこのチュートリアルの次のステップとして、MongoDBをもっと学ぶために マニュアル を読んでください。 |

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