MongoDB進歩認識


関係
リレーショナル・データベースには1対1、1対多、多対1、多対多の関係があり、MongoDBも同様です.MongoDBはBSONでデータを整理している点が柔軟です.例:1人に複数のアドレスがあります.2つのテーブルを保存できます.1つのuserテーブル、1つのaddressテーブルです.userとaddressは一対の多関係である.userテーブルのdocumentを見てください
{
   "_id":ObjectId("72355788888abcf289bc9cc4"),
   "name": "sunyang",
   "contact": "12345678",
   "age": "27"
}

対応するaddress
{
   "_id":ObjectId("52ffc4a5d85242602e000000"),
   "building": "changan road No.123",
   "pincode": 123456,
   "city": "Beijing",
   "state": "China"
} 

はめ込む
{
   "_id":ObjectId("72355788888abcf289bc9cc4"),
   "name": "sunyang",
   "contact": "12345678",
   "age": "27",
   "address":[
	{
	   "_id":ObjectId("52ffc4a5d85242602e000000"),
	   "building": "changan road No.123",
	   "pincode": 123456,
	   "city": "Beijing",
	   "state": "China"
	} ,
	{
	   "_id":ObjectId("52ffc4a5d85242602e000001"),
	   "building": "changan road No.123",
	   "pincode": 123456,
	   "city": "Beijing",
	   "state": "China"
	} 
  ]
}

これにより、1つのドキュメントにデータが保存され、クエリーが容易になります.
db.users.findOne({"name":"sunyang"},{"address":1})

参照
{
   "_id":ObjectId("72355788888abcf289bc9cc4"),
   "name": "sunyang",
   "contact": "12345678",
   "age": "27",
   "address_ids":[
	   ObjectId("52ffc4a5d85242602e000000"),
	   ObjectId("52ffc4a5d85242602e000001")
  ]
}

この方式では2回のクエリが必要で,ObjectIdを先に調べ,アドレスを調べる.
>var result = db.users.findOne({"name":"sunyang"},{"address_ids":1})
>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})

データベース参照
データベース間で参照されるシーンには、3つのパラメータが必要です.
{ $ref : , $id : , $db :  }

≪インスタンス|Instance|emdw≫
{
   "_id":ObjectId("1111222222333333333"),
   "address": {
   "$ref": "address_home",
   "$id": ObjectId("11111111111111111111"),
   "$db": "address"},
   "contact": "123456",
   "age": "27",
   "name": "sunyang"
}

検索方法
>var user = db.users.findOne({"name":"sunyang"})
>var dbRef = user.address
>db[dbRef.$ref].findOne({"_id":ObjectId(dbRef.$id)})

このネーミングスペースタイプは、明らかにデータベース内でツリー構造を維持し、プレースホルダのような形で値を取ります.
索引
構文
db.collection.createIndex(keys, options)

≪インスタンス|Instance|emdw≫
db.col.createIndex({"title":1,"description":-1})
db.values.createIndex({open: 1, close: 1}, {background: true})

1:昇順-1:降順
optionsは
backgroundインデックス作成プロセスは他のデータベース操作をブロックします.backgroundは、後でインデックスを作成する方法を指定します.すなわち、「background」オプションパラメータを追加します.「background」のデフォルト値はfalseです.Uniqueによって確立されたインデックスが一意であるかどうか.trueに一意のインデックスを作成するように指定します.デフォルトはfalse.nameインデックスの名前.指定されていない場合、MongoDBのインデックスを接続するフィールド名とソート順によってインデックス名が生成されます.dropDups 3.0+バージョンは破棄されました.一意のインデックスを作成するときに重複レコードを削除するかどうか、trueが一意のインデックスを作成することを指定します.デフォルトはfalse.sparseは、ドキュメントに存在しないフィールドデータに対してインデックスを有効にしません.このパラメータは、trueに設定すると、インデックスフィールドに対応するフィールドを含まないドキュメントがクエリーされないことに特に注意してください.デフォルトはfalse.expireAfterSeconds integer秒単位の数値を指定し、TTL設定を完了し、集合の生存時間を設定します.vインデックスのバージョン番号.デフォルトのインデックスバージョンはmongodがインデックスを作成するときに実行されるバージョンに依存します.Weights documentインデックスウェイト値は、1~999999の値で、他のインデックスフィールドに対するインデックスのスコアウェイトを表します.default_Languageテキストインデックスでは,このパラメータが語および語幹と語器を無効にする規則のリストを決定する.デフォルトは英語language_overrideテキストインデックスの場合、このパラメータはドキュメントに含まれるフィールド名を指定し、言語はデフォルトのlanguageを上書きし、デフォルトはlanguageである.
コレクションインデックスの表示
db.col.getIndexes()

コレクションインデックスサイズの表示
db.col.totalIndexSize()

コレクションのすべてのインデックスを削除
db.col.dropIndexes()

コレクション指定インデックスの削除
db.col.dropIndex("    ")

クエリーの上書き
このネット上にも多くの解釈があり、明らかに間違っているものがあります.この上書きインデックスはoracleインデックスと同じようにfast range scanを歩きます.例を挙げる
>db.users.createIndex({gender:1,user_name:1})

genderでuserを検索しますname、除外_id値は、インデックスから直接データを取得します.(_idはデフォルトで返されるため)
>db.users.find({gender:"M"},{user_name:1,_id:0})

mongodbによると、インデックスはメモリに作成されるので、リードキャッシュに相当し、すぐに作成されるという.しかし、インデックスはメモリに影響を与えませんか?インデックスフィールドは配列でインデックスを上書きできません.(この概念は比較的新しいです.oracle、mysqlではこのような状況はあり得ないからです)
explain()クエリー分析
>db.users.find({gender:"M"},{user_name:1,_id:0}).explain()

表示可能なフィールド
indexOnly:フィールドはtrueで、インデックスが使用されていることを示します.Cursor:このクエリではインデックスが使用されており、MongoDBではインデックスがBツリー構造に格納されているため、BtreeCursorタイプのカーソルも使用されています.インデックスが使用されていない場合、カーソルのタイプはBasicCursorです.このキーには、現在のデータベースの下のシステムを表示できるインデックスの名前も表示されます.indexesセット(インデックス情報が格納されているため、これは少し言及される)を使用して、インデックスの詳細を取得します.n:現在のクエリで返されるドキュメントの数.nscanned/nscannedObjects:現在のクエリがセット内の複数のドキュメントをスキャンしていることを示します.この数値と戻りドキュメントの数を近づけることを目的としています.millis:現在のクエリーに要する時間、ミリ秒数.indexBounds:現在のクエリで具体的に使用されているインデックス.
hint()インデックスの指定
次のクエリ・インスタンスはgenderとuserの使用を指定します.nameインデックスフィールドでクエリーするには、次の手順に従います.
>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})

配列インデックス
以下の集合を考える
{
   "address": {
      "city": "Los Angeles",
      "state": "California",
      "pincode": "123"
   },
   "tags": [
      "music",
      "cricket",
      "blogs"
   ],
   "name": "Tom Benzamin"
}

tagsフィールドは集合であり、ここではユーザラベルと見なすことができ、この上にインデックスを構築することは、集合に含まれるすべての要素に連合インデックスを構築することに相当する.
>db.users.ensureIndex({"tags":1})

使用
>db.users.find({tags:"cricket"})

サブドキュメント索引
どのように条件をフィルタリングするかは、別の関係表、例えば商品表と商品詳細表、トップページ検索条件が詳細表にある場合、商品表にサブドキュメントインデックスを作成することができます.このインデックスは複雑な感じがしますが、実際の開発ではプライマリ・テーブル・インデックスを作成し、クエリーを関連付けたほうがいいかもしれません.例:
>db.users.ensureIndex({"address.city":1,"address.state":1,"address.pincode":1})

インデックスを作成すると、サブドキュメントのフィールドを使用してデータを取得できます.
>db.users.find({"address.city":"Los Angeles"})  

oracleと同様に、フィールドの位置はアナライザがインデックスを歩くかどうかの判断に影響しません.
インデックスメモリの問題
インデックスはメモリ(RAM)に格納されているため、インデックスのサイズがメモリの制限を超えないことを確認する必要があります.インデックスのサイズがメモリの制限より大きい場合、MongoDBはインデックスを削除し、パフォーマンスが低下します.インデックスが表示されない場合があります.これはoracleの考え方と同じです.たとえば、フィールドの算術演算、正規表現、$where句などです.(ここではoracleとは少し違うようですが、where条件はインデックスを移動せず、find()メソッドはインデックスを移動します)
索引のサイズ
コレクション内のインデックスは64個を超えないインデックス名の長さは128文字を超えない複合インデックスは最大31個のフィールドを持つことができます
じゅうごう
sqlのcountに似ています(*)
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

集約式
$sum	    。	db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
$avg	     	db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
$min	                。	db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
$max	                。	db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
$push	               。	db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
$addToSet	               ,      。	db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
$first	                  。	db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])
$last	                   	db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])

パイプ操作
$project:         。       、      ,                 。
$match:      ,          。$match  MongoDB       。
$limit:    MongoDB          。
$skip:               ,        。
$unwind:                   ,           。
$group:         ,       。
$sort:          。
$geoNear:               。

例:
db.article.aggregate(
    { $project : {
        title : 1 ,
        author : 1 ,
    }}
 );

そうなると結果的にはid,tilte,authorの3つのフィールドがあり、デフォルトでは_idフィールドは含まれていますが、含まない場合は_idはこのようにすることができます:
db.article.aggregate(
    { $project : {
        _id : 0 ,
        title : 1 ,
        author : 1
    }});

$matchインスタンス
db.articles.aggregate( [
                        { $match : { score : { $gt : 70, $lte : 90 } } },
                        { $group: { _id: null, count: { $sum: 1 } } }
                       ] );

$matchは、スコアが70以上90以下のレコードを取得し、条件に合致するレコードを次のフェーズ$groupパイプオペレータに送って処理します.$skipインスタンス
db.article.aggregate(
    { $skip : 5 });

$skipパイプオペレータで処理すると、最初の5つのドキュメントが「フィルタ」されます.(改ページ)
ObjectId
ObjectIdは唯一のプライマリ・キーと同様に、12 bytesを含む12 bytesを迅速に生成およびソートできます.
最初の4バイトはunixタイムスタンプの作成、グリニッジタイムUTC時間、北京時間より8時間遅れた次の3バイトはマシン識別コードの直後の2バイトでプロセスidからなるPIDの最後の3バイトは乱数です
形式的にはこれとoracleのrowidの差は多くありませんが、中に保存されている情報は多いです.ObjectIdの作成
>newObjectId = ObjectId()

ObjectIdからタイムスタンプを取得
>ObjectId("5349b4ddd2781d08c09890f4").getTimestamp()

文字列に変換
>new ObjectId().str

注意:http://www.runoob.com/mongodb/整理学習