mongodb実践1


プロジェクトではMemcachedを使ったことがありますが、最近mongodbを勉強しました.学習過程をまとめます.
iteyeを登録して3年になりましたが、これは初めての文章で、本当に耻ずかしいです:(
 
 
mongodbはオープンソースのドキュメント型データベースであり、典型的なNoSqlデータベースである.mongodbの公式サイトでmongodbを紹介する例には、リアルタイム分析、ログ処理、電子商取引、ドキュメントアーカイブなどがあります.
以下の内容は本人がmongodbを勉強するときのメモで、主にshell操作の部分です.
 
#mongodbインストール
 
*mongodbのインストールファイルをダウンロードmongodb-win 32-x 86_64-1.6.5.zipは、解凍します.解凍したファイル名を便利にmongodbと名付けます.例えば、F:/mongodbです.
*mongodbのデータベースストレージフォルダ(F:/data/dbなど)を作成します.
*cmd、cdから~/binディレクトリに入り、mongod-dbpath=F:/data/db(テスト"/"も""も使用可能--注:window 7環境、"~"はインストールディレクトリを表す)を入力してmongodbデータベースを起動し、Ctrl+Cでデータベースを閉じることができます.
*cmdウィンドウを開き、cdから~/binにmongoコマンドを入力し、デフォルトでtestデータベースに接続し、dbコマンドを入力するとすべてのデータベースを表示できます.
 
このときF:/data/dbディレクトリは空っぽで、mongodbはtestデータベースを作成していないため、データ挿入操作がmongodbである場合にデータベースを本当に作成することができ、useコマンドを使用して本来存在しないデータベースに切り替えるのはデータベースを表すものではありません.
本当に作成されました.
mongodbの公式サイトでそう言っています@
他のデータベース経験のある開発者へのヒント
次の例では、データベースと集計を作成していないことに気づくかもしれません.MongoDBはそうする必要はありません.データを挿入すると、MongoDBは対応する集約とデータベースを確立します.存在しない集計をクエリーすると、Mongoは空の集計と見なします.
useコマンドを使用してデータベースを切り替えると、すぐにデータベースが作成されません.データベースは、最初にデータを挿入したときに作成が遅延します.これは、最初にデータベースをuseすると、show dbsコマンドのリストにデータが挿入されるまでデータベースが表示されないことを意味します.
 
#データベースに接続しshellでデータベースを操作する
 
#データベースへの接続、ヘルプ情報の取得
 
*~/bin/mongo.exeファイルはshellコマンドの実行ファイルです(注:このshellは彼shellではありません.Unixの下のshellと混同しないでください).ここのshellは実際にjsです.cmdウィンドウを開き、cdから~/binにmongo-hコマンドを入力し、以下のヘルプ情報を得る@
 
	MongoDB shell version: 1.6.5
	usage: mongo [options] [db address] [file names (ending in .js)]
	db address can be:
	  foo                   foo database on local machine
	  192.169.0.5/foo       foo database on 192.168.0.5 machine
	  192.169.0.5:9999/foo  foo database on 192.168.0.5 machine on port 9999
	options:
	  --shell               run the shell after executing files
	  --nodb                don't connect to mongod on startup - no 'db address' 
				arg expected
	  --quiet               be less chatty
	  --port arg            port to connect to
	  --host arg            server to connect to
	  --eval arg            evaluate javascript
	  -u [ --username ] arg username for authentication
	  -p [ --password ] arg password for authentication
	  -h [ --help ]         show this usage information
	  --version             show version information
	  --ipv6                enable IPv6 support (disabled by default)
 
 
 
file names: a list of files to run. files have to end in .js and will exit after unless --shell is specified
#データベースへのデータの挿入
 
*shellにコマンドを入力@
 
> r = {name:"mongo"};
		{ "name" : "mongo" }
		> db.things.save(r);
		> r = {description : "mongodb is a no sql db"}
		{ "description" : "mongodb is a no sql db" }
		> db.things.save(r);
		> db.things.find();
		{ "_id" : ObjectId("4ee84d530c16000000006ec4"), "name" : "mongo" }
		{ "_id" : ObjectId("4ee84dee0c16000000006ec5"), "description" : "mongodb is a no sql db" }
 
 
mongodbはフリーモード、あるいはダイナミックモード、mongodbの公式サイトで@
 
と書く
A MongoDB collection is a collection of BSON documents. These documents usually have the same structure, but this is not a requirement since MongoDB is a schema-free (or more accurately, "dynamic schema") database. You may store a heterogeneous set of documents within a collection, as you do not need predefine the collection's "columns"or fields.
A collection is created when the first document is inserted.
Collection names should begin with letters or an underscore and may include numbers; $ is reserved. Collections can be organized in namespaces; these are named groups of collections defined using a dot notation. For example, you could define collections blog.posts and blog.authors, both reside under "blog". Note that this is simply an organizational mechanism for the user -- the collection namespace is flat from the database's perspective.
The maximum size of a collection name is 128 characters (including the name of the db and indexes). It is probably best to keep it under 80/90 chars.
 
注意点:
集約を事前に定義していません.データベースは、最初の挿入操作時に自動的にセットを作成します.
私たちが保存しているドキュメントは、任意の異なる構造を持つことができます.実際、この例では、ドキュメント間に共通のデータ要素はありません.実際のアプリケーションでは、ドキュメントは通常、同じ構造で集約に保存されます.この柔軟性は、移行や拡張が非常に容易であることを意味します.「alter table」などの操作を実行するためにスクリプトを書く必要はほとんどありません.
データベースに挿入されると、オブジェクトに割り当てられた[object ID](まだない場合)が_に格納されます.idドメイン内
上記の例を実行すると、ObjectIDの値が異なります.
 
説明します:コマンドのdbは私たちが使用しているデータベース「mydb」と理解できます.thingsはmydbのデータベースと理解できますが、rは1行のレコードと理解できます.
 
*forループでデータを挿入@
for (var i = 1; i <= 20; i++) db.things.save({i : i, i2 : i*i});
このコマンドは、データベースに20個のデータを挿入します.データの最初の要素はiで、2番目の要素はiの平方です.
#クエリーデータ
 
*カーソルを使用してデータベースを問合せ、@
 
> var cursor = db.things.find();
> while (cursor.hasNext()) printjson(cursor.next());
 
 
印刷情報は省略します...
1番目の文はカーソルを取得し、2番目の文はカーソルを巡り、ドキュメントオブジェクトをjson形式に変換して印刷します.
でもいいです@
> db.things.find().forEach(printjson);  
印刷情報は省略します...
 
あるいはカーソルを配列とすることもできますが、これはリスクがあり、データ量が大きい場合はメモリの容量を考慮する必要があります.そうしないと、結果は^^!!@
> var cursor = db.things.find();
		> printjson(cursor[4]);
		{ "_id" : ObjectId("4ee8510a0c16000000006ec8"), "i" : 3, "i2" : 9 }
		         @
		> var arr = db.things.find().toArray();
		> arr[4]
		{ "_id" : ObjectId("4ee8510a0c16000000006ec8"), "i" : 3, "i2" : 9 }
 
#条件クエリー
 
*クエリnameはmongoのレコードであり、このようにすることができる@
> db.things.find({name:"mongo"}).forEach(function(x) {print(tojson(x));});
		{ "_id" : ObjectId("4ee84d530c16000000006ec4"), "name" : "mongo" }
 
この文はmongoのすべてのnameのレコードを返します.
*特定のドメインを問い合わせると、このように書くことができます@
> db.things.find({i:4},{i2:true}).forEach(function(x) {print(tojson(x));});
		{ "_id" : ObjectId("4ee8510a0c16000000006ec9"), "i2" : 16 }
		{ "_id" : ObjectId("4ee8514d0c16000000006edd"), "i2" : 16 }
 
この文はiが4のすべてのデータのi 2ドメインを返し、sqlの「SELECT j FROM things WHERE x=4」と同様に、上の文をsqlに訳すと「SELECT*FROM things WHERE name='mongo'」になるはずです.
mongodb公式サイトは@
クエリ式自体がドキュメントオブジェクトであり、{a:A,b:B,...}に似ている場合のドキュメントでオブジェクトがクエリーされると、「where a=A and b=B and...」と表示されます.
複数の条件のクエリ文をこのように書くことができます@
> db.things.find({i:4,i2:16}).forEach(function(x) {print(tojson(x));});
		{ "_id" : ObjectId("4ee8510a0c16000000006ec9"), "i" : 4, "i2" : 16 }
 
*レコードを検索@
> db.things.findOne({name:"mongo"});
		{ "_id" : ObjectId("4ee84d530c16000000006ec4"), "name" : "mongo" }
 
この文はカーソルを返さず、データベース内の条件を満たす最初のレコードを返します.
 
*クエリ前のnレコード@
> db.things.find().limit(3);
		{ "_id" : ObjectId("4ee84d530c16000000006ec4"), "name" : "mongo" }
		{ "_id" : ObjectId("4ee84dee0c16000000006ec5"), "description" : "mongodb is a no sql db" }
		{ "_id" : ObjectId("4ee8510a0c16000000006ec6"), "i" : 1, "i2" : 1 }
 
 
ではmysqlのlimit m,nの効果を達成するにはどうすればいいのでしょうか.焦らないで、まずヘルプ情報を見て、&これは良い習慣です:)、コマンドを入力@
> db.things.find().help();
		find() modifiers
			.sort( {...} )
			.limit( n )
			.skip( n )
			.count() - total # of objects matching query, ignores skip,limit
			.size() - total # of objects cursor would return, honors skip,limit
			.explain([verbose])
			.hint(...)
			.showDiskLoc() - adds a $diskLoc field to each returned object

		Cursor methods
			.forEach( func )
			.print() - output to console in full pretty format
			.map( func )
			.hasNext()
			.next()
 
コマンドを組み合わせてlimit m,nの効果を達成することができます.できるかどうかにかかわらず、以下のコマンドを実行します@
> db.things.find().skip(10).limit(3);
		{ "_id" : ObjectId("4ee8510a0c16000000006ece"), "i" : 9, "i2" : 81 }
		{ "_id" : ObjectId("4ee8510a0c16000000006ecf"), "i" : 10, "i2" : 100 }
		{ "_id" : ObjectId("4ee8510a0c16000000006ed0"), "i" : 11, "i2" : 121 }
 
不思議ですね.mongoは直列操作をサポートしています.
 
*クエリーとソートは、このような操作も可能です@
> db.things.find( { $query : { i : 3, i2 : 9 }, $orderby : { i2 : 1 } } );
		{ "_id" : ObjectId("4ee8510a0c16000000006ec8"), "i" : 3, "i2" : 9 }
		{ "_id" : ObjectId("4ee8514d0c16000000006edc"), "i" : 3, "i2" : 9, "i3" : 27 }
 
*mongodbでnull値がちょっと特別@
		> db.things.find({i:100,i3:null});{ "_id" : ObjectId("4ee96a64bd3e000000003380"), "i" : 100, "i2" : 10000, "i3" : null }
		> db.things.find({i3:{$exists :false }});
		{ "_id" : ObjectId("4ee84d530c16000000006ec4"), "name" : "mongo" }
		{ "_id" : ObjectId("4ee84dee0c16000000006ec5"), "description" : "mongodb is a no sql db" }
		{ "_id" : ObjectId("4ee8510a0c16000000006ec6"), "i" : 1, "i2" : 1 }
		{ "_id" : ObjectId("4ee8510a0c16000000006ec7"), "i" : 2, "i2" : 4 }
		{ "_id" : ObjectId("4ee8510a0c16000000006ec8"), "i" : 3, "i2" : 9 }
		...
 
検索の仕方もいろいろあります@
$all
		$exists
		$mod
		$ne
		$in
		$nin
		$nor
		$or
		$and
		$size
		$type
		$regex
		$where
 
ここで、$regexは、従来のリレーショナル・データベースのLIKE'%ABC'(ABCで終わる文字)のような方法をサポートします.例えば@
> db.customers.find( { name :/j*i/} );
		{ "_id" : ObjectId("4ee9924c8b12000000004f85"), "name" : "joy white", "age" : 23 }
 
mongodb公式曰く@
mongoは完全なJavaScript shellなので、JavaScriptメソッド、構文、クラスはshellで使用できます.だからjavascriptスクリプトを書いているときに完全に自分で書くことができます.
 
これまで人の文章を読んでいたが、文章を書くのは実は疲れていたのか.