チュートリアル

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 をタイプします。

他のデータベースの経験がある開発者のためのTip
お気づきかもしれませんが、この例では、データベースもコレクションも作成していません。MongoDBでは必要がありません。何かデータを作成すると、MongoDBは基本的なコレクションとデータベースを作成します。存在しないコレクションに対してクエリーを発行すると、MongoDBは空のコレクションとして返します。

use コマンドでデータベースを切り替えても、データベースはすぐには作成されません。データベースは、最初にデータが作成されたときに作成されます。つまり、 use を最初にした後で、 `show dbs` を実行してもデータが作成されるまでは、リストに表示されません。

データをコレクションへ挿入

テスト用のコレクションを作成し、データを入れてみましょう。二つのオブジェクト jt を作ります。そしてそれを 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 }
>

いくつかの注意事項 :

  • 上記の例では、私たちはコレクションを作成していませんが、MongoDBが最初のインサートで自動的にコレクションを作成します。
  • 自由な"構造"でドキュメントを保存することができます。実際にこの例では、ドキュメントは全く共通した要素を持っていません。習慣的には、同じコレクションには同じ構造のドキュメントを保存しますが、この柔軟性によって、スキーマの移行や拡張を用意に行えることを意味します。また、"alter table"と言ったタイプのスクリプトを書く必要がほとんどありません。
  • データベースに挿入されたオブジェクトにはobject ID_id fieldとして付加されます(存在してないときのみ)
  • あなたが上記例を実行したとき、ObjectIDは違う値になるでしょう。

もう少しレコードをコレクションに追加してみましょう。

> 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' GuideQueries 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"コマンドに加えて、 dbdb.なんでも に対してhelpを呼ぶことで、メソッドのサマリーを見ることができます。

また、あるファンクションが何をするか、ということを知りたい場合には、 () なしでタイプすることで、ソースを表示することができます。たとえば、

> printjson
function (x) {
  print(tojson(x));
}

mongo は、完全なJavaScriptシェルなので、どのJavaScriptのファンクション、文法、クラスをシェルの中で使うことができます。加えて、MongoDBは独自のクラスやglobal変数(例えば、 db)を定義しています。 http://api.mongodb.org/js/ ですべてのAPIを見ることができます。

次は

このチュートリアルの次のステップとして、MongoDBをもっと学ぶために マニュアル を読んでください。


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