MongoDB(二)

18348 ワード

一、MongoDBを取り付ける
1、MongoDBの取り付け
rpmパッケージのダウンロード先:http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/RPMS/
[[email protected] ~]# yum localinstall -y mongo-10gen-2.4.14-mongodb_1.x86_64.rpm mongo-10gen-server-2.4.14-mongodb_1.x86_64.rpm
2、rpmパッケージから作成されたいくつかの重要書類を確認する.
[[email protected] ~]# rpm -ql mongo-10gen
/usr/bin/bsondump
/usr/bin/mongo
/usr/bin/mongodump
/usr/bin/mongoexport
/usr/bin/mongofiles
/usr/bin/mongoimport
/usr/bin/mongooplog
/usr/bin/mongoperf
/usr/bin/mongorestore
/usr/bin/mongostat
/usr/bin/mongotop
[[email protected] ~]# rpm -ql mongo-10gen-server
/etc/mongod.conf
/etc/rc.d/init.d/mongod
/etc/sysconfig/mongod
/usr/bin/mongod
/usr/bin/mongos
/usr/share/man/man1/mongod.1
/usr/share/man/man1/mongos.1
/var/lib/mongo
/var/log/mongo
/var/log/mongo/mongod.log
3、データベースを初期化する
説明:実際に使用して、データを格納するディレクトリを冗長性のある論理ボリュームに置く.
[[email protected] ~]# mkdir /data/mongodb -p
[[email protected] ~]# vim /etc/mongod.conf 
dbpath=/data/mongodb
4、データベースを起動する
[[email protected] ~]# service mongod start
Starting mongod: about to fork child process, waiting until server is ready for connections.
forked process: 4713
all output going to: /var/log/mongo/mongod.log
child process started successfully, parent exiting     [  ]                                                           
[[email protected] ~]# ss -tnlp |grep mongod
LISTEN     0      128                       *:28017                    *:*      users:(("mongod",4713,11))
LISTEN     0      128                       *:27017                    *:*      users:(("mongod",4713,9))
5、MongoDBのwebインターフェース
wKioL1YXH0iS6XqsAAJ0LxfzhjY415.jpg
二、MongoDBを使う
1、MongoDBとMySQLの文法比較
   従来の関係データベースは、データベース、テーブル、レコードの3つの階層の概念から構成されており、MongoDBはデータベース、集合、ドキュメントオブジェクトの3つの階層から構成されている.MongoDBは関係型データベース内の表に対して、集合中に列、行と関係概念がなく、これはモードの自由の特徴を表しています.
wKiom1YXLTyCCMcrAAQUcrqGXJc774.jpg
wKioL1YXLVWw5mKjAAVsegKQPEs488.jpg
wKiom1YXLT2yvuazAAMpiu5cFjY014.jpg
wKioL1YXLVbRajhBAACvPjpCDSo141.jpg
2、モノゴdb文法
すべてのデータを照会します.
db.colls.find() //select * from colls
指定された条件で照会する
db.colls.find({‘last_name’: ‘Smith’});//select * from colls where last_name=’Smith’
複数条件クエリーの指定
db.colls.find( { x : 3, y : “foo” } );//select * from colls where x=3 and y=’foo’
条件範囲のクエリーを指定します.
db.colls.find({j: {$ne: 3}, k: {$gt: 10} });//select * from colls where j!=3 and k>10
クエリには何かが含まれていません.
db.colls.find({}, {a:0});//   a 0      
サポート<=>=>=>は、それぞれの代わりに記号を使う必要があります.
db.colls.find({ “field” : { $gt: value } } );
db.colls.find({ “field” : { $lt: value } } );
db.colls.find({ “field” : { $gte: value } } );
db.colls.find({ “field” : { $lte: value } } );
フィールドの範囲を調べてもいいです.
db.colls.find({ “field” : { $gt: value1, $lt: value2 } } );
検索用文字ではないです.
db.colls.find( { x : { $ne : 3 } } );
inクエリ用文字
db.colls.find( { “field” : { $in : array } } );
db.colls.find({j:{$in: [2,4,6]}});
not inクエリ用文字
db.colls.find({j:{$nin: [2,4,6]}});
モジュレータクエリ用文字
db.colls.find( { a : { $mod : [ 10 , 1 ] } } )// where a % 10 == 1
$allクエリ
db.colls.find( { a: { $all: [ 2, 3 ] } } );//  a         
$sizeクエリ
db.colls.find( { a : { $size: 1 } } );//        ,     a       1   
$existsクエリ
db.colls.find( { a : { $exists : true } } ); //   a     
db.colls.find( { a : { $exists : false } } ); //    a     
$typeクエリー$typeの値はbsonhttp://bsonspec.org/データの種類値
db.colls.find( { a : { $type : 2 } } ); //   a string    
db.colls.find( { a : { $type : 16 } } ); //   a int    
正規表現でマッチする
db.colls.find( { name : /acme.*corp/i } );//   SQL like
埋め込みオブジェクトクエリ
db.colls.find( { “author.name” : “joe” } );
1.1.3バージョンとより高いバージョンは$notクエリを含みます.
db.colls.find( { name : { $not : /acme.*corp/i } } );
db.colls.find( { a : { $not : { $mod : [ 10 , 1 ] } } } );
ソート()並べ替え
db.colls.find().sort( { ts : -1 } );//1   2   
limit()制限クエリデータに個数を返します.
db.colls.find().limit(10)
skyp()はいくつかのデータをスキップします.
db.colls.find().skip(10)
snapshot()スナップショットは重複データが戻ったり、オブジェクトがなくなったりしないことを保証します.
 
count()クエリーの対象個数を統計します.
db.students.find({‘address.state’ : ‘CA’}).count();//    
db.students.find({‘address.state’ : ‘CA’}).toArray().length;//    
 
group()は、クエリー結果パケットとSQLのgroup by関数に類似しています.
distinct()は重複しない値を返します.
3、照会文の説明:
“db.collection.find(<query>,<projection>)”
SQLでselect文と同様に、「query」はwhere子文に相当し、「projection」は選択するフィールドに相当する.
使用するfind()方法に「query」が含まれていない場合、対応するcollectionのすべての文書を返すことを意味する.
「db.co llection.com()」方法は、指定されたcollection内のドキュメントの個数を統計することができる.
比較演算:
$gt:指定されたフィールド値が指定値より大きいドキュメントを選択すると、構文形式「{field:{$gt:value}」になります.
$gte:指定されたフィールド値が指定された値以上のドキュメントを選択すると、構文書式は「{field:$gte:value]」です.
$n:指定されたフィールドの値を指定された配列内のドキュメントに選択すると、構文書式は「{filed:}」「{value 1]、、…」;
$lt:指定されたフィールド値が指定された値より小さいドキュメントを選択すると、構文形式「{field:}」;
$lte:指定されたフィールド値が指定された値以下のドキュメントを選択すると、構文形式「{field:}」;
$ne:指定されたフィールド値が指定された値に等しくないドキュメントを選択してください.構文形式「{filed:}」;
$nin:指定されたフィールドの値が指定された配列内にないか、あるいは存在しないドキュメントを選択して、構文形式「filed:{$nin:'….valueN]」;
論理演算:
論理演算は一般的に複数の選択条件を接続するために使用されますが、MongoDBでサポートされている論理演算「Query Selector」には以下のような種類があります.
$or演算、ステートメント形式「{expressition 1>」、{expressition 2>、…、{expressitionN>}」
$and:演算と、文法形式「{expressitions 1>」、{expressition 2>、…、{expressitionN>}」
$and:非演算、文法フォーマット「{field:}」{not:}」
$nor:逆演算とは、指定された条件に合致しない文書を返すことで、構文形式「{expression 1>」、{}、...、{expressionN>」」.
要素クエリ:
ドキュメント内にフィールドがあるかどうかなどの条件によってドキュメントを選択するには、要素演算が必要です.
$exixts:指定されたフィールドの存在性に基づいてドキュメントを選択すると、構文形式「{field:{$exists]」、」を指定し、「true」を指定すると指定されたフィールドが存在するドキュメントに戻り、「false」は指定されたフィールドが存在しないドキュメントに戻ります.
$mod:指定されたフィールドの値をモジュレータ演算し、その剰余が指定された値のドキュメントに返します.構文形式は「{field:{$mod:[divisor,remander]」.
$type:指定されたフィールドに戻る値の種類が指定されたタイプのドキュメントで、構文形式「{field:}」.
3、実際に練習する
データベースに接続
[[email protected] ~]# mongo
MongoDB shell version: 2.4.14
connecting to: test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
 http://docs.mongodb.org/
Questions? Try the support group
 http://groups.google.com/group/mongodb-user
>
データの挿入
> show dbs
admin(empty)
local0.078125GB
> db.testcoll.insert({Name:"bols"})
> show collections
system.indexes
testcoll
> db.testcoll.insert({Name:"longls"})
> db.testcoll.find()
{ "_id" : ObjectId("5602a24111db41a96277c761"), "Name" : "bols" }
{ "_id" : ObjectId("5602a28811db41a96277c762"), "Name" : "longls" }
> show dbs
admin(empty)
local0.078125GB
test0.203125GB
表示状態:
> db.testcoll.stats()
{
 "ns" : "test.testcoll",
 "count" : 2,
 "size" : 80,
 "avgObjSize" : 40,
 "storageSize" : 4096,
 "numExtents" : 1,
 "nindexes" : 1,
 "lastExtentSize" : 4096,
 "paddingFactor" : 1,
 "systemFlags" : 1,
 "userFlags" : 0,
 "totalIndexSize" : 8176,
 "indexSizes" : {
  "_id_" : 8176
 },
 "ok" : 1
}
二つのデータを挿入して100 m以上の空間を占めています.
wKioL1YXLaySzGSIAAIpNnPoP2o249.jpg
mongodbの占有空間が大きすぎる理由は、公式FAQにおいて、次のようないくつかの点が挙げられている.
  • 空間のプリキャスト:多すぎるハードディスクの断片を形成することを避けるために、mongodbは空間が不足するたびに大きなハードディスクの空間を生成することを申請し、申請の量は64 M、128 M、256 Mのような指数から増加し、2 Gが単一ファイルの最大体積になるまで.データ量が増加するにつれて、これらのブロック全体の生成容量が増加しつつあるファイルをそのデータディレクトリで見ることができます. 
  • フィールド名が占有する空間:各記録内の構造情報をクエリのために保持するために、mongodbは各フィールドのkey-valu eをBSONとして記憶する必要があり、もしvalu eドメインがkeyドメインに対して大きくないなら、例えば数値型のデータを保存するなら、データのoverheadは最大である.一つの空間占有を減らす方法は、フィールド名をできるだけ短くして、スペースを占用するのは小さいですが、これは易読性と空間占用のトレードオフとして要求されます.フィールドの名作のindexを、フィールド名ごとにバイトで表現するように著者に勧めましたが、フィールド名の長さは心配しなくてもいいです.しかし、著者の懸念も無理はないです.このようなインデックス方式は毎回検索して結果を得た後、インデックス値を元の値に変えてクライアントに送ります.この代替も時間がかかります.今の実現は空間を持って時間と引き換えにします. 
  • 記録を削除して解放しない空間:これは簡単に理解できます.記録削除後のデータの大規模な移動を避けるために、元の記録空間は削除しないで、「削除済み」だけをマークすればいいです.後でまた再利用できます. 
  • は定期的にdb.repairDatabase()を実行して記録を整理することができますが、このプロセスは比較的遅くなります. 
  • コレクションを削除:
    > db.testcoll.drop()
    true
    > show collections
    system.indexes
    > show dbs
    admin(empty)
    local0.078125GB
    test0.203125GB
    練習例を追加:
    > for(i=1;i<=100;i++) db.testcoll.insert({Name:"User:"+i,Age:i,Gender:"F",PreferBooks:["First blood","Second blood"]})
    前の2行の文書を表示します.
    > db.testcoll.find().limit(2)
    { "_id" : ObjectId("5602aa5311db41a96277c763"), "Name" : "User:1", "Age" : 1, "Gender" : "F", "PreferBooks" : [  "First blood",  "Second blood" ] }
    { "_id" : ObjectId("5602aa5311db41a96277c764"), "Name" : "User:2", "Age" : 2, "Gender" : "F", "PreferBooks" : [  "First blood",  "Second blood" ] }
    年齢5の文書を削除:
    > db.testcoll.remove({Age:5})
    > db.testcoll.find().limit(6)
    { "_id" : ObjectId("5602aa5311db41a96277c763"), "Name" : "User:1", "Age" : 1, "Gender" : "F", "PreferBooks" : [  "First blood",  "Second blood" ] }
    { "_id" : ObjectId("5602aa5311db41a96277c764"), "Name" : "User:2", "Age" : 2, "Gender" : "F", "PreferBooks" : [  "First blood",  "Second blood" ] }
    { "_id" : ObjectId("5602aa5311db41a96277c765"), "Name" : "User:3", "Age" : 3, "Gender" : "F", "PreferBooks" : [  "First blood",  "Second blood" ] }
    { "_id" : ObjectId("5602aa5311db41a96277c766"), "Name" : "User:4", "Age" : 4, "Gender" : "F", "PreferBooks" : [  "First blood",  "Second blood" ] }
    { "_id" : ObjectId("5602aa5311db41a96277c768"), "Name" : "User:6", "Age" : 6, "Gender" : "F", "PreferBooks" : [  "First blood",  "Second blood" ] }
    { "_id" : ObjectId("5602aa5311db41a96277c769"), "Name" : "User:7", "Age" : 7, "Gender" : "F", "PreferBooks" : [  "First blood",  "Second blood" ] }
    ユーザがUser:3の文書を削除します.
    > db.testcoll.remove({Name: "User:3"})
    > db.testcoll.find().limit(5)
    { "_id" : ObjectId("5602aa5311db41a96277c763"), "Name" : "User:1", "Age" : 1, "Gender" : "F", "PreferBooks" : [  "First blood",  "Second blood" ] }
    { "_id" : ObjectId("5602aa5311db41a96277c764"), "Name" : "User:2", "Age" : 2, "Gender" : "F", "PreferBooks" : [  "First blood",  "Second blood" ] }
    { "_id" : ObjectId("5602aa5311db41a96277c766"), "Name" : "User:4", "Age" : 4, "Gender" : "F", "PreferBooks" : [  "First blood",  "Second blood" ] }
    { "_id" : ObjectId("5602aa5311db41a96277c768"), "Name" : "User:6", "Age" : 6, "Gender" : "F", "PreferBooks" : [  "First blood",  "Second blood" ] }
    { "_id" : ObjectId("5602aa5311db41a96277c769"), "Name" : "User:7", "Age" : 7, "Gender" : "F", "PreferBooks" : [  "First blood",  "Second blood" ] }
    User:4ユーザの年齢を22に変更します.
    > db.testcoll.update({Name: "User:4"},{$set: {Age: 22}})
    > db.testcoll.find().limit(4)
    { "_id" : ObjectId("5602aa5311db41a96277c763"), "Name" : "User:1", "Age" : 1, "Gender" : "F", "PreferBooks" : [  "First blood",  "Second blood" ] }
    { "_id" : ObjectId("5602aa5311db41a96277c764"), "Name" : "User:2", "Age" : 2, "Gender" : "F", "PreferBooks" : [  "First blood",  "Second blood" ] }
    { "_id" : ObjectId("5602aa5311db41a96277c766"), "Name" : "User:4", "Age" : 22, "Gender" : "F", "PreferBooks" : [  "First blood",  "Second blood" ] }
    { "_id" : ObjectId("5602aa5311db41a96277c768"), "Name" : "User:6", "Age" : 6, "Gender" : "F", "PreferBooks" : [  "First blood",  "Second blood" ] }
    testライブラリの文書数と97歳以上の文書を確認します.
    > db.testcoll.count()
    98
    > db.testcoll.find({Age: {$gte :97}})
    { "_id" : ObjectId("5602aa5311db41a96277c7c3"), "Name" : "User:97", "Age" : 97, "Gender" : "F", "PreferBooks" : [  "First blood",  "Second blood" ] }
    { "_id" : ObjectId("5602aa5311db41a96277c7c4"), "Name" : "User:98", "Age" : 98, "Gender" : "F", "PreferBooks" : [  "First blood",  "Second blood" ] }
    { "_id" : ObjectId("5602aa5311db41a96277c7c5"), "Name" : "User:99", "Age" : 99, "Gender" : "F", "PreferBooks" : [  "First blood",  "Second blood" ] }
    { "_id" : ObjectId("5602aa5311db41a96277c7c6"), "Name" : "User:100", "Age" : 100, "Gender" : "F", "PreferBooks" : [  "First blood",  "Second blood" ] }
    97歳以上の年齢の文書を調べて、NameとAgeだけを表示します.
    > db.testcoll.find({Age: {$gte :97}},{Name:1,Age:1})
    { "_id" : ObjectId("5602aa5311db41a96277c7c3"), "Name" : "User:97", "Age" : 97 }
    { "_id" : ObjectId("5602aa5311db41a96277c7c4"), "Name" : "User:98", "Age" : 98 }
    { "_id" : ObjectId("5602aa5311db41a96277c7c5"), "Name" : "User:99", "Age" : 99 }
    { "_id" : ObjectId("5602aa5311db41a96277c7c6"), "Name" : "User:100", "Age" : 100 }
    クエリAgeは60より大きく、66より小さい文書です.
    > db.testcoll.find({$and:[{Age: {$gt:60}},{Age: {$lt: 66}}]},{Name:1})
    { "_id" : ObjectId("5602aa5311db41a96277c79f"), "Name" : "User:61" }
    { "_id" : ObjectId("5602aa5311db41a96277c7a0"), "Name" : "User:62" }
    { "_id" : ObjectId("5602aa5311db41a96277c7a1"), "Name" : "User:63" }
    { "_id" : ObjectId("5602aa5311db41a96277c7a2"), "Name" : "User:64" }
    { "_id" : ObjectId("5602aa5311db41a96277c7a3"), "Name" : "User:65" }
    Adressフィールドを含むドキュメントを検索します.
    > db.testcoll.find({Adress: {$exists:true}})
    { "_id" : ObjectId("5602b12411db41a96277c7c8"), "Name" : "xiyan", "Age" : 25, "Gender" : "F", "Adress" : "Chongqing,China" }
    Ageが98より大きい文書のGenderをMに変更します.
    > db.testcoll.update({Age: {$gt:98}},{$set: {Gender: "M"}},{multi:true})
    > db.testcoll.find({Age: {$gte: 98}})
    { "_id" : ObjectId("5602aa5311db41a96277c7c4"), "Name" : "User:98", "Age" : 98, "Gender" : "F", "PreferBooks" : [  "First blood",  "Second blood" ] }
    { "_id" : ObjectId("5602aa5311db41a96277c7c5"), "Name" : "User:99", "Age" : 99, "Gender" : "M", "PreferBooks" : [  "First blood",  "Second blood" ] }
    { "_id" : ObjectId("5602aa5311db41a96277c7c6"), "Name" : "User:100", "Age" : 100, "Gender" : "M", "PreferBooks" : [  "First blood",  "Second blood" ] }
    NameをUser:99とするドキュメントのPreferBook項目を削除します.
    > db.testcoll.update({Name: "User:99"},{$unset: {PreferBooks: ""}})
    > db.testcoll.find({Age: {$gte: 98}})
    { "_id" : ObjectId("5602aa5311db41a96277c7c4"), "Name" : "User:98", "Age" : 98, "Gender" : "F", "PreferBooks" : [  "First blood",  "Second blood" ] }
    { "Age" : 99, "Gender" : "M", "Name" : "User:99", "_id" : ObjectId("5602aa5311db41a96277c7c5") }
    { "_id" : ObjectId("5602aa5311db41a96277c7c6"), "Name" : "User:100", "Age" : 100, "Gender" : "M", "PreferBooks" : [  "First blood",  "Second blood" ] }