MongoDB-クイックガイド

MongoDBは、クロスプラットフォームのドキュメント指向データベースであり、高性能、高可用性、および容易なスケーラビリティを提供します。MongoDBは、コレクションとドキュメントの概念に取り組んでいます。

データベース

データベースは、コレクションの物理コンテナです。各データベースは、ファイルシステム上で独自のファイルセットを取得します。通常、単一のMongoDBサーバーには複数のデータベースがあります。

コレクション

コレクションはMongoDBドキュメントのグループです。これは、RDBMSテーブルに相当します。コレクションは単一のデータベース内に存在します。コレクションはスキーマを強制しません。コレクション内のドキュメントには、さまざまなフィールドを含めることができます。通常、コレクション内のすべてのドキュメントは、類似または関連する目的のものです。

資料

ドキュメントは、キーと値のペアのセットです。ドキュメントには動的スキーマがあります。動的スキーマとは、同じコレクション内のドキュメントが同じフィールドまたは構造のセットを持つ必要がなく、コレクションのドキュメント内の共通フィールドが異なるタイプのデータを保持する可能性があることを意味します。

次の表は、RDBMSの用語とMongoDBの関係を示しています。

RDBMS MongoDB
データベース データベース
テーブル コレクション
タプル/行 資料
カラム フィールド
テーブル結合 埋め込まれたドキュメント
主キー 主キー(mongodb自体によって提供されるデフォルトのキー_id)
データベースサーバーとクライアント
Mysqld / Oracle mongod
mysql / sqlplus モンゴ

サンプルドキュメント

次の例は、ブログサイトのドキュメント構造を示しています。これは、単にコンマで区切られたキーと値のペアです。

{
   _id: ObjectId(7df78ad8902c)
   title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by: 'tutorials point',
   url: 'http://www.tutorialspoint.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100, 
   comments: [	
      {
         user:'user1',
         message: 'My first comment',
         dateCreated: new Date(2011,1,20,2,15),
         like: 0 
      },
      {
         user:'user2',
         message: 'My second comments',
         dateCreated: new Date(2011,1,25,7,45),
         like: 5
      }
   ]
}

_idは、すべてのドキュメントの一意性を保証する12バイトの16進数です。ドキュメントの挿入中に_idを指定できます。指定しない場合、MongoDBはすべてのドキュメントに一意のIDを提供します。これらの12バイトの最初の4バイトは現在のタイムスタンプ、次の3バイトはマシンID、次の2バイトはMongoDBサーバーのプロセスID、残りの3バイトは単純な増分VALUEです。

リレーショナルデータベースには、テーブルの数とこれらのテーブル間の関係を示す典型的なスキーマ設計があります。MongoDBにいる間、関係の概念はありません。

RDBMSに対するMongoDBの利点

  • Schema less− MongoDBは、1つのコレクションが異なるドキュメントを保持するドキュメントデータベースです。フィールドの数、コンテンツ、およびドキュメントのサイズは、ドキュメントごとに異なる場合があります。

  • 単一のオブジェクトの構造は明確です。

  • 複雑な結合はありません。

  • 深いクエリ能力。MongoDBは、SQLとほぼ同じくらい強力なドキュメントベースのクエリ言語を使用して、ドキュメントに対する動的クエリをサポートします。

  • Tuning.

  • Ease of scale-out −MongoDBは簡単に拡張できます。

  • アプリケーションオブジェクトからデータベースオブジェクトへの変換/マッピングは必要ありません。

  • (ウィンドウ化された)ワーキングセットを格納するために内部メモリを使用し、データへのより高速なアクセスを可能にします。

なぜMongoDBを使用するのですか?

  • Document Oriented Storage −データはJSONスタイルのドキュメントの形式で保存されます。

  • 任意の属性のインデックス

  • レプリケーションと高可用性

  • Auto-sharding

  • 豊富なクエリ

  • 迅速なインプレース更新

  • MongoDBによるプロフェッショナルサポート

MongoDBをどこで使用しますか?

  • ビッグデータ
  • コンテンツの管理と配信
  • モバイルおよびソーシャルインフラストラクチャ
  • ユーザーデータ管理
  • データハブ

WindowsにMongoDBをインストールする方法を見てみましょう。

WindowsにMongoDBをインストールする

WindowsにMongoDBをインストールするには、まずMongoDBの最新リリースをからダウンロードします。 https://www.mongodb.org/downloads。Windowsのバージョンに応じて、正しいバージョンのMongoDBを入手してください。Windowsのバージョンを取得するには、コマンドプロンプトを開き、次のコマンドを実行します。

C:\>wmic os get osarchitecture
OSArchitecture
64-bit
C:\>

32ビットバージョンのMongoDBは、2GB未満のデータベースのみをサポートし、テストと評価の目的にのみ適しています。

次に、ダウンロードしたファイルをc:\ドライブまたはその他の場所に抽出します。解凍したフォルダーの名前がmongodb-win32-i386- [バージョン]またはmongodb-win32-x86_64- [バージョン]であることを確認してください。ここで[バージョン]はMongoDBダウンロードのバージョンです。

次に、コマンドプロンプトを開き、次のコマンドを実行します。

C:\>move mongodb-win64-* mongodb
   1 dir(s) moved.
C:\>

別の場所でMongoDBを抽出した場合は、コマンドを使用してそのパスに移動します cd FOLDER/DIR 次に、上記のプロセスを実行します。

MongoDBには、ファイルを保存するためのデータフォルダーが必要です。MongoDBデータディレクトリのデフォルトの場所はc:\ data \ dbです。したがって、コマンドプロンプトを使用してこのフォルダを作成する必要があります。次のコマンドシーケンスを実行します。

C:\>md data
C:\md data\db

別の場所にMongoDBをインストールする必要がある場合は、の代替パスを指定する必要があります \data\db パスを設定する dbpathmongod.exe。同様に、次のコマンドを発行します。

コマンドプロンプトで、MongoDBインストールフォルダーにあるbinディレクトリに移動します。私のインストールフォルダがD:\set up\mongodb

C:\Users\XYZ>d:
D:\>cd "set up"
D:\set up>cd mongodb
D:\set up\mongodb>cd bin
D:\set up\mongodb\bin>mongod.exe --dbpath "d:\set up\mongodb\data"

これは表示されます waiting for connections コンソール出力のメッセージ。mongod.exeプロセスが正常に実行されていることを示します。

ここでMongoDBを実行するには、別のコマンドプロンプトを開き、次のコマンドを発行する必要があります。

D:\set up\mongodb\bin>mongo.exe
MongoDB shell version: 2.4.6
connecting to: test
>db.test.save( { a: 1 } )
>db.test.find()
{ "_id" : ObjectId(5879b0f65a56a454), "a" : 1 }
>

これは、MongoDBがインストールされ、正常に実行されていることを示しています。次回MongoDBを実行するときは、コマンドのみを発行する必要があります。

D:\set up\mongodb\bin>mongod.exe --dbpath "d:\set up\mongodb\data" 
D:\set up\mongodb\bin>mongo.exe

UbuntuにMongoDBをインストールする

次のコマンドを実行して、MongoDB公開GPGキーをインポートします-

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

次のコマンドを使用して、/ etc / apt / sources.list.d /mongodb.listファイルを作成します。

echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' 
   | sudo tee /etc/apt/sources.list.d/mongodb.list

次のコマンドを発行して、リポジトリを更新します-

sudo apt-get update

次に、次のコマンドを使用してMongoDBをインストールします-

apt-get install mongodb-10gen = 2.2.3

上記のインストールでは、2.2.3が現在MongoDBバージョンでリリースされています。必ず最新バージョンをインストールしてください。これで、MongoDBが正常にインストールされました。

MongoDBを起動します

sudo service mongodb start

MongoDBを停止します

sudo service mongodb stop

MongoDBを再起動します

sudo service mongodb restart

MongoDBを使用するには、次のコマンドを実行します。

mongo

これにより、実行中のMongoDBインスタンスに接続されます。

MongoDBヘルプ

コマンドのリストを取得するには、次のように入力します db.help()MongoDBクライアントで。これにより、次のスクリーンショットに示すようなコマンドのリストが表示されます。

MongoDB統計

MongoDBサーバーに関する統計を取得するには、コマンドを入力します db.stats()MongoDBクライアントで。これにより、データベース名、コレクションの数、およびデータベース内のドキュメントが表示されます。コマンドの出力を次のスクリーンショットに示します。

MongoDBのデータには、同じコレクション内に柔軟なschema.documentsがあります。それらは同じフィールドまたは構造のセットを持つ必要はなく、コレクションのドキュメント内の共通フィールドは異なるタイプのデータを保持する場合があります。

MongoDBでスキーマを設計する際のいくつかの考慮事項

  • ユーザーの要件に従ってスキーマを設計します。

  • オブジェクトを一緒に使用する場合は、オブジェクトを1つのドキュメントに結合します。それ以外の場合は、それらを分離します(ただし、結合の必要がないことを確認してください)。

  • 計算時間と比較してディスク容量が安いため、データを複製します(ただし制限があります)。

  • 読み取り時ではなく、書き込み中に結合を実行します。

  • 最も頻繁なユースケースに合わせてスキーマを最適化します。

  • スキーマで複雑な集計を行います。

クライアントが自分のブログ/ Webサイトのデータベース設計を必要としていて、RDBMSとMongoDBスキーマ設計の違いを確認するとします。ウェブサイトには以下の要件があります。

  • すべての投稿には、固有のタイトル、説明、およびURLがあります。
  • すべての投稿に1つ以上のタグを付けることができます。
  • すべての投稿には、発行者の名前といいねの総数があります。
  • すべての投稿には、名前、メッセージ、データ時間などとともにユーザーからのコメントがあります。
  • 各投稿には、0個以上のコメントがあります。

RDBMSスキーマでは、上記の要件の設計には最低3つのテーブルがあります。

MongoDBスキーマにある間、デザインには1つのコレクションポストと次の構造があります-

{
   _id: POST_ID
   title: TITLE_OF_POST, 
   description: POST_DESCRIPTION,
   by: POST_BY,
   url: URL_OF_POST,
   tags: [TAG1, TAG2, TAG3],
   likes: TOTAL_LIKES, 
   comments: [	
      {
         user:'COMMENT_BY',
         message: TEXT,
         dateCreated: DATE_TIME,
         like: LIKES 
      },
      {
         user:'COMMENT_BY',
         message: TEXT,
         dateCreated: DATE_TIME,
         like: LIKES
      }
   ]
}

したがって、データを表示する際、RDBMSでは3つのテーブルを結合する必要があり、MongoDBでは、データは1つのコレクションからのみ表示されます。

この章では、MongoDBでデータベースを作成する方法を説明します。

使用コマンド

MongoDB use DATABASE_NAMEデータベースの作成に使用されます。このコマンドは、データベースが存在しない場合は新しいデータベースを作成し、存在しない場合は既存のデータベースを返します。

構文

の基本構文 use DATABASE ステートメントは次のとおりです-

use DATABASE_NAME

名前の付いたデータベースを使用する場合 <mydb>、その後 use DATABASE ステートメントは次のようになります-

>use mydb
switched to db mydb

現在選択されているデータベースを確認するには、コマンドを使用します db

>db
mydb

データベースリストを確認する場合は、次のコマンドを使用します show dbs

>show dbs
local     0.78125GB
test      0.23012GB

作成したデータベース(mydb)がリストにありません。データベースを表示するには、データベースに少なくとも1つのドキュメントを挿入する必要があります。

>db.movie.insert({"name":"tutorials point"})
>show dbs
local      0.78125GB
mydb       0.23012GB
test       0.23012GB

MongoDBでは、デフォルトのデータベースはテストです。データベースを作成しなかった場合、コレクションはテストデータベースに保存されます。

この章では、MongoDBコマンドを使用してデータベースを削除する方法を説明します。

dropDatabase()メソッド

MongoDB db.dropDatabase() コマンドは、既存のデータベースを削除するために使用されます。

構文

の基本構文 dropDatabase() コマンドは次のとおりです-

db.dropDatabase()

これにより、選択したデータベースが削除されます。データベースを選択していない場合は、デフォルトの「テスト」データベースが削除されます。

まず、次のコマンドを使用して、使用可能なデータベースのリストを確認します。 show dbs

>show dbs
local      0.78125GB
mydb       0.23012GB
test       0.23012GB
>

新しいデータベースを削除したい場合 <mydb>、その後 dropDatabase() コマンドは次のようになります-

>use mydb
switched to db mydb
>db.dropDatabase()
>{ "dropped" : "mydb", "ok" : 1 }
>

次に、データベースのリストを確認します。

>show dbs
local      0.78125GB
test       0.23012GB
>

この章では、MongoDBを使用してコレクションを作成する方法を説明します。

createCollection()メソッド

MongoDB db.createCollection(name, options) コレクションの作成に使用されます。

構文

の基本構文 createCollection() コマンドは次のとおりです-

db.createCollection(name, options)

コマンドでは、 name 作成するコレクションの名前です。 Options はドキュメントであり、コレクションの構成を指定するために使用されます。

パラメータ タイプ 説明
名前 ストリング 作成するコレクションの名前
オプション 資料 (オプション)メモリサイズとインデックス作成に関するオプションを指定します

Optionsパラメーターはオプションであるため、コレクションの名前のみを指定する必要があります。以下は、使用できるオプションのリストです。

フィールド タイプ 説明
キャップ付き ブール値 (オプション)trueの場合、上限付きコレクションを有効にします。上限付きコレクションは、最大サイズに達すると最も古いエントリを自動的に上書きする固定サイズのコレクションです。If you specify true, you need to specify size parameter also.
autoIndexId ブール値 (オプション)trueの場合、_idフィールドにインデックスを自動的に作成します。デフォルト値はfalseです。
サイズ (オプション)上限付きコレクションの最大サイズをバイト単位で指定します。 If capped is true, then you need to specify this field also.
最大 (オプション)上限付きコレクションで許可されるドキュメントの最大数を指定します。

ドキュメントを挿入する際、MongoDBは最初に上限付きコレクションのサイズフィールドをチェックし、次に最大フィールドをチェックします。

の基本構文 createCollection() オプションなしの方法は次のとおりです-

>use test
switched to db test
>db.createCollection("mycollection")
{ "ok" : 1 }
>

コマンドを使用して、作成されたコレクションを確認できます show collections

>show collections
mycollection
system.indexes

次の例は、の構文を示しています。 createCollection() 重要なオプションがほとんどない方法-

>db.createCollection("mycol", { capped : true, autoIndexId : true, size : 
   6142800, max : 10000 } )
{ "ok" : 1 }
>

MongoDBでは、コレクションを作成する必要はありません。MongoDBは、ドキュメントを挿入すると、コレクションを自動的に作成します。

>db.tutorialspoint.insert({"name" : "tutorialspoint"})
>show collections
mycol
mycollection
system.indexes
tutorialspoint
>

この章では、MongoDBを使用してコレクションを削除する方法を説明します。

drop()メソッド

MongoDBの db.collection.drop() データベースからコレクションを削除するために使用されます。

構文

の基本構文 drop() コマンドは次のとおりです-

db.COLLECTION_NAME.drop()

まず、利用可能なコレクションをデータベースにチェックインします mydb

>use mydb
switched to db mydb
>show collections
mycol
mycollection
system.indexes
tutorialspoint
>

次に、名前の付いたコレクションをドロップします mycollection

>db.mycollection.drop()
true
>

再度、コレクションのリストをデータベースにチェックインします。

>show collections
mycol
system.indexes
tutorialspoint
>

drop()メソッドは、選択したコレクションが正常にドロップされた場合はtrueを返し、それ以外の場合はfalseを返します。

MongoDBは多くのデータ型をサポートしています。それらのいくつかは-

  • String−これは、データを格納するために最も一般的に使用されるデータ型です。MongoDBの文字列はUTF-8で有効である必要があります。

  • Integer−このタイプは数値を格納するために使用されます。整数は、サーバーに応じて32ビットまたは64ビットになります。

  • Boolean −このタイプは、ブール(true / false)値を格納するために使用されます。

  • Double −このタイプは、浮動小数点値を格納するために使用されます。

  • Min/ Max keys −このタイプは、値を最低および最高のBSON要素と比較するために使用されます。

  • Arrays −このタイプは、配列、リスト、または複数の値を1つのキーに格納するために使用されます。

  • Timestamp−ctimestamp。これは、ドキュメントが変更または追加されたときに記録するのに便利です。

  • Object −このデータ型は埋め込みドキュメントに使用されます。

  • Null −このタイプは、Null値を格納するために使用されます。

  • Symbol−このデータ型は文字列と同じように使用されます。ただし、通常、特定の記号タイプを使用する言語用に予約されています。

  • Date −このデータ型は、現在の日付または時刻をUNIX時間形式で格納するために使用されます。Dateのオブジェクトを作成し、それに日、月、年を渡すことで、独自の日時を指定できます。

  • Object ID −このデータ型は、ドキュメントのIDを格納するために使用されます。

  • Binary data −このデータ型は、バイナリデータを格納するために使用されます。

  • Code −このデータ型は、JavaScriptコードをドキュメントに格納するために使用されます。

  • Regular expression −このデータ型は、正規表現を格納するために使用されます。

この章では、MongoDBコレクションにドキュメントを挿入する方法を学習します。

insert()メソッド

MongoDBコレクションにデータを挿入するには、MongoDBを使用する必要があります insert() または save() 方法。

構文

の基本構文 insert() コマンドは次のとおりです-

>db.COLLECTION_NAME.insert(document)

>db.mycol.insert({
   _id: ObjectId(7df78ad8902c),
   title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by: 'tutorials point',
   url: 'http://www.tutorialspoint.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
})

ここに mycol前の章で作成したコレクション名です。コレクションがデータベースに存在しない場合、MongoDBはこのコレクションを作成し、ドキュメントをそのコレクションに挿入します。

挿入されたドキュメントで、_idパラメーターを指定しない場合、MongoDBはこのドキュメントに一意のObjectIdを割り当てます。

_idは、コレクション内のすべてのドキュメントに固有の12バイトの16進数です。12バイトは次のように分割されます-

_id: ObjectId(4 bytes timestamp, 3 bytes machine id, 2 bytes process id, 
   3 bytes incrementer)

1つのクエリに複数のドキュメントを挿入するには、insert()コマンドでドキュメントの配列を渡すことができます。

>db.post.insert([
   {
      title: 'MongoDB Overview', 
      description: 'MongoDB is no sql database',
      by: 'tutorials point',
      url: 'http://www.tutorialspoint.com',
      tags: ['mongodb', 'database', 'NoSQL'],
      likes: 100
   },
	
   {
      title: 'NoSQL Database', 
      description: "NoSQL database doesn't have tables",
      by: 'tutorials point',
      url: 'http://www.tutorialspoint.com',
      tags: ['mongodb', 'database', 'NoSQL'],
      likes: 20, 
      comments: [	
         {
            user:'user1',
            message: 'My first comment',
            dateCreated: new Date(2013,11,10,2,35),
            like: 0 
         }
      ]
   }
])

使用できるドキュメントを挿入するには db.post.save(document)また。指定しない場合_id その後、ドキュメントで save() メソッドはと同じように機能します insert()方法。_idを指定すると、save()メソッドで指定された_idを含むドキュメントのデータ全体が置き換えられます。

この章では、MongoDBコレクションからドキュメントをクエリする方法を学習します。

find()メソッド

MongoDBコレクションからデータをクエリするには、MongoDBを使用する必要があります find() 方法。

構文

の基本構文 find() 方法は次のとおりです-

>db.COLLECTION_NAME.find()

find() メソッドは、構造化されていない方法ですべてのドキュメントを表示します。

pretty()メソッド

結果をフォーマットされた方法で表示するには、次を使用できます。 pretty() 方法。

構文

>db.mycol.find().pretty()

>db.mycol.find().pretty()
{
   "_id": ObjectId(7df78ad8902c),
   "title": "MongoDB Overview", 
   "description": "MongoDB is no sql database",
   "by": "tutorials point",
   "url": "http://www.tutorialspoint.com",
   "tags": ["mongodb", "database", "NoSQL"],
   "likes": "100"
}
>

find()メソッドとは別に、 findOne() 1つのドキュメントのみを返すメソッド。

RDBMSWhere句の同等物MongoDB

何らかの条件に基づいてドキュメントをクエリするには、次の操作を使用できます。

操作 構文 RDBMSと同等
平等 {<キー>:<値>} db.mycol.find({"by": "tutorials point"})。pretty() ここで、by = 'tutorials point'
未満 {<キー>:{$ lt:<値>}} db.mycol.find({"likes":{$ lt:50}})。pretty() 50未満が好きな場所
等しい未満 {<key>:{$ lte:<value>}} db.mycol.find({"likes":{$ lte:50}})。pretty() 好きな場所<= 50
大なり記号 {<キー>:{$ gt:<値>}} db.mycol.find({"likes":{$ gt:50}})。pretty() 50を超える好きな場所
大なり記号 {<キー>:{$ gte:<値>}} db.mycol.find({"likes":{$ gte:50}})。pretty() 好きな場所> = 50
等しくない {<キー>:{$ ne:<値>}} db.mycol.find({"likes":{$ ne:50}})。pretty() 好きなところ!= 50

そしてMongoDBで

構文

の中に find() メソッドでは、複数のキーを「」で区切って渡すと、MongoDBはそれを次のように扱います。 AND状態。以下はの基本的な構文ですAND

>db.mycol.find(
   {
      $and: [
         {key1: value1}, {key2:value2}
      ]
   }
).pretty()

次の例は、「tutorials point」によって記述され、タイトルが「MongoDBOverview」であるすべてのチュートリアルを示しています。

>db.mycol.find({$and:[{"by":"tutorials point"},{"title": "MongoDB Overview"}]}).pretty() {
   "_id": ObjectId(7df78ad8902c),
   "title": "MongoDB Overview", 
   "description": "MongoDB is no sql database",
   "by": "tutorials point",
   "url": "http://www.tutorialspoint.com",
   "tags": ["mongodb", "database", "NoSQL"],
   "likes": "100"
}

上記の例では、同等のwhere句は次のようになります。 ' where by = 'tutorials point' AND title = 'MongoDB Overview' '。find句では、キーと値のペアをいくつでも渡すことができます。

またはMongoDBで

構文

OR条件に基づいてドキュメントをクエリするには、次を使用する必要があります。 $orキーワード。以下はの基本的な構文ですOR

>db.mycol.find(
   {
      $or: [
         {key1: value1}, {key2:value2}
      ]
   }
).pretty()

次の例は、「tutorialspoint」またはタイトルが「MongoDBOverview」で書かれたすべてのチュートリアルを示しています。

>db.mycol.find({$or:[{"by":"tutorials point"},{"title": "MongoDB Overview"}]}).pretty()
{
   "_id": ObjectId(7df78ad8902c),
   "title": "MongoDB Overview", 
   "description": "MongoDB is no sql database",
   "by": "tutorials point",
   "url": "http://www.tutorialspoint.com",
   "tags": ["mongodb", "database", "NoSQL"],
   "likes": "100"
}
>

ANDとORを一緒に使用する

次の例は、いいねが10を超え、タイトルが「MongoDBの概要」または「チュートリアルポイント」のいずれかであるドキュメントを示しています。同等のSQLwhere句は'where likes>10 AND (by = 'tutorials point' OR title = 'MongoDB Overview')'

>db.mycol.find({"likes": {$gt:10}, $or: [{"by": "tutorials point"},
   {"title": "MongoDB Overview"}]}).pretty()
{
   "_id": ObjectId(7df78ad8902c),
   "title": "MongoDB Overview", 
   "description": "MongoDB is no sql database",
   "by": "tutorials point",
   "url": "http://www.tutorialspoint.com",
   "tags": ["mongodb", "database", "NoSQL"],
   "likes": "100"
}
>

MongoDBの update() そして save()メソッドは、ドキュメントをコレクションに更新するために使用されます。update()メソッドは既存のドキュメントの値を更新し、save()メソッドは既存のドキュメントをsave()メソッドで渡されたドキュメントに置き換えます。

MongoDB Update()メソッド

update()メソッドは、既存のドキュメントの値を更新します。

構文

の基本構文 update() 方法は次のとおりです-

>db.COLLECTION_NAME.update(SELECTION_CRITERIA, UPDATED_DATA)

mycolコレクションに次のデータがあるとします。

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}

次の例では、タイトルが「MongoDBOverview」であるドキュメントの新しいタイトル「NewMongoDBTutorial」を設定します。

>db.mycol.update({'title':'MongoDB Overview'},{$set:{'title':'New MongoDB Tutorial'}})
>db.mycol.find()
{ "_id" : ObjectId(5983548781331adf45ec5), "title":"New MongoDB Tutorial"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}
>

デフォルトでは、MongoDBは単一のドキュメントのみを更新します。複数のドキュメントを更新するには、パラメータ「multi」をtrueに設定する必要があります。

>db.mycol.update({'title':'MongoDB Overview'},
   {$set:{'title':'New MongoDB Tutorial'}},{multi:true})

MongoDB Save()メソッド

ザ・ save() メソッドは、既存のドキュメントをsave()メソッドで渡された新しいドキュメントに置き換えます。

構文

MongoDBの基本構文 save() 方法を以下に示します-

>db.COLLECTION_NAME.save({_id:ObjectId(),NEW_DATA})

次の例では、ドキュメントを_id'5983548781331adf45ec5 'に置き換えます。

>db.mycol.save(
   {
      "_id" : ObjectId(5983548781331adf45ec5), "title":"Tutorials Point New Topic",
      "by":"Tutorials Point"
   }
)
>db.mycol.find()
{ "_id" : ObjectId(5983548781331adf45ec5), "title":"Tutorials Point New Topic",
   "by":"Tutorials Point"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}
>

この章では、MongoDBを使用してドキュメントを削除する方法を学習します。

remove()メソッド

MongoDBの remove()メソッドは、コレクションからドキュメントを削除するために使用されます。remove()メソッドは2つのパラメーターを受け入れます。1つは削除基準で、もう1つはjustOneフラグです。

  • deletion criteria −(オプション)ドキュメントによる削除基準が削除されます。

  • justOne −(オプション)trueまたは1に設定されている場合は、1つのドキュメントのみを削除します。

構文

の基本構文 remove() 方法は次のとおりです-

>db.COLLECTION_NAME.remove(DELLETION_CRITTERIA)

mycolコレクションに次のデータがあるとします。

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}

次の例では、タイトルが「MongoDBOverview」であるすべてのドキュメントを削除します。

>db.mycol.remove({'title':'MongoDB Overview'})
>db.mycol.find()
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}
>

1つだけ削除する

複数のレコードがあり、最初のレコードのみを削除する場合は、 justOne のパラメータ remove() 方法。

>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)

すべてのドキュメントを削除する

削除基準を指定しない場合、MongoDBはコレクションからドキュメント全体を削除します。 This is equivalent of SQL's truncate command.

>db.mycol.remove({})
>db.mycol.find()
>

MongoDBでは、プロジェクションとは、ドキュメントのデータ全体を選択するのではなく、必要なデータのみを選択することを意味します。ドキュメントに5つのフィールドがあり、3つだけを表示する必要がある場合は、それらから3つのフィールドのみを選択します。

find()メソッド

MongoDBの find()MongoDB Query Documentで説明されているメソッドは、取得するフィールドのリストである2番目のオプションのパラメーターを受け入れます。MongoDBでは、実行するとfind()メソッドの場合、ドキュメントのすべてのフィールドが表示されます。これを制限するには、値1または0のフィールドのリストを設定する必要があります。1はフィールドを表示するために使用され、0はフィールドを非表示にするために使用されます。

構文

の基本構文 find() 投影法は次のとおりです-

>db.COLLECTION_NAME.find({},{KEY:1})

コレクションmycolに次のデータがあるとします-

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}

次の例では、ドキュメントのクエリ中にドキュメントのタイトルを表示します。

>db.mycol.find({},{"title":1,_id:0})
{"title":"MongoDB Overview"}
{"title":"NoSQL Overview"}
{"title":"Tutorials Point Overview"}
>

ご注意ください _id 実行中は常にフィールドが表示されます find() メソッド、このフィールドが必要ない場合は、0に設定する必要があります。

この章では、MongoDBを使用してレコードを制限する方法を学習します。

Limit()メソッド

MongoDBのレコードを制限するには、次を使用する必要があります limit()方法。このメソッドは、表示するドキュメントの数である1つの数値型引数を受け入れます。

構文

の基本構文 limit() 方法は次のとおりです-

>db.COLLECTION_NAME.find().limit(NUMBER)

コレクションmyycolに次のデータがあるとします。

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}

次の例では、ドキュメントのクエリ中に2つのドキュメントのみが表示されます。

>db.mycol.find({},{"title":1,_id:0}).limit(2)
{"title":"MongoDB Overview"}
{"title":"NoSQL Overview"}
>

でnumber引数を指定しない場合 limit() メソッドを実行すると、コレクションのすべてのドキュメントが表示されます。

MongoDB Skip()メソッド

limit()メソッドとは別に、もう1つのメソッドがあります skip() これも数値型引数を受け入れ、ドキュメントの数をスキップするために使用されます。

構文

の基本構文 skip() 方法は次のとおりです-

>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

次の例では、2番目のドキュメントのみが表示されます。

>db.mycol.find({},{"title":1,_id:0}).limit(1).skip(1)
{"title":"NoSQL Overview"}
>

のデフォルト値に注意してください skip() メソッドは0です。

この章では、MongoDBでレコードを並べ替える方法を学習します。

sort()メソッド

MongoDBでドキュメントを並べ替えるには、次を使用する必要があります sort()方法。このメソッドは、フィールドのリストとそのソート順を含むドキュメントを受け入れます。ソート順を指定するには、1と-1を使用します。1は昇順に使用され、-1は降順に使用されます。

構文

の基本構文 sort() 方法は次のとおりです-

>db.COLLECTION_NAME.find().sort({KEY:1})

コレクションmyycolに次のデータがあるとします。

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"Tutorials Point Overview"}

次の例では、タイトルでソートされたドキュメントを降順で表示します。

>db.mycol.find({},{"title":1,_id:0}).sort({"title":-1})
{"title":"Tutorials Point Overview"}
{"title":"NoSQL Overview"}
{"title":"MongoDB Overview"}
>

並べ替えの設定を指定しない場合は、 sort() メソッドは、ドキュメントを昇順で表示します。

インデックスは、クエリの効率的な解決をサポートします。インデックスがない場合、MongoDBはコレクションのすべてのドキュメントをスキャンして、クエリステートメントに一致するドキュメントを選択する必要があります。このスキャンは非常に非効率的であり、MongoDBが大量のデータを処理する必要があります。

インデックスは特別なデータ構造であり、データセットのごく一部をトラバースしやすい形式で格納します。インデックスは、特定のフィールドまたはフィールドのセットの値を、インデックスで指定されたフィールドの値の順に格納します。

sureIndex()メソッド

インデックスを作成するには、MongoDBのensureIndex()メソッドを使用する必要があります。

構文

の基本構文 ensureIndex() メソッドは次のとおりです()。

>db.COLLECTION_NAME.ensureIndex({KEY:1})

ここで、キーはインデックスを作成するフィールドの名前であり、1は昇順です。降順でインデックスを作成するには、-1を使用する必要があります。

>db.mycol.ensureIndex({"title":1})
>

ensureIndex() 複数のフィールドにインデックスを作成するために、複数のフィールドを渡すことができるメソッド。

>db.mycol.ensureIndex({"title":1,"description":-1})
>

ensureIndex()メソッドは、オプションのリスト(オプション)も受け入れます。以下はリストです-

パラメータ タイプ 説明
バックグラウンド ブール値 インデックスを作成しても他のデータベースアクティビティがブロックされないように、バックグラウンドでインデックスを作成します。バックグラウンドでビルドするにはtrueを指定します。デフォルト値はfalse
ユニーク ブール値 一意のインデックスを作成して、インデックスキーがインデックス内の既存の値と一致するドキュメントの挿入をコレクションが受け入れないようにします。trueを指定して、一意のインデックスを作成します。デフォルト値はfalse
名前 ストリング インデックスの名前。指定されていない場合、MongoDBは、インデックス付きフィールドの名前と並べ替え順序を連結してインデックス名を生成します。
dropDups ブール値 重複している可能性のあるフィールドに一意のインデックスを作成します。MongoDBは、キーの最初の出現のみにインデックスを付け、そのキーの後続の出現を含むすべてのドキュメントをコレクションから削除します。trueを指定して、一意のインデックスを作成します。デフォルト値はfalse
スパース ブール値 trueの場合、インデックスは指定されたフィールドを持つドキュメントのみを参照します。これらのインデックスは使用するスペースが少なくなりますが、状況によっては動作が異なります(特にソート)。デフォルト値はfalse
expireAfterSeconds 整数 MongoDBがこのコレクション内のドキュメントを保持する期間を制御するTTLとして、値を秒単位で指定します。
v インデックスバージョン インデックスのバージョン番号。デフォルトのインデックスバージョンは、インデックスの作成時に実行されているMongoDBのバージョンによって異なります。
重み 資料 重みは1から99,999の範囲の数値であり、スコアの観点から、他のインデックス付きフィールドと比較したフィールドの重要性を示します。
既定の言語 ストリング テキストインデックスの場合、ストップワードのリストとステマーおよびトークナイザーのルールを決定する言語。デフォルト値はenglish
language_override ストリング テキストインデックスの場合、デフォルト言語を上書きする言語を含むドキュメント内のフィールドの名前を指定します。デフォルト値は言語です。

集計操作はデータレコードを処理し、計算結果を返します。集計操作は、複数のドキュメントの値をグループ化し、グループ化されたデータに対してさまざまな操作を実行して、単一の結果を返すことができます。SQLのcount(*)およびgroup byは、mongodb集計と同等です。

Aggregate()メソッド

MongoDBでの集計には、次を使用する必要があります aggregate() 方法。

構文

の基本構文 aggregate() 方法は次のとおりです-

>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

コレクションには、次のデータがあります-

{
   _id: ObjectId(7df78ad8902c)
   title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by_user: 'tutorials point',
   url: 'http://www.tutorialspoint.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
},
{
   _id: ObjectId(7df78ad8902d)
   title: 'NoSQL Overview', 
   description: 'No sql database is very fast',
   by_user: 'tutorials point',
   url: 'http://www.tutorialspoint.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 10
},
{
   _id: ObjectId(7df78ad8902e)
   title: 'Neo4j Overview', 
   description: 'Neo4j is no sql database',
   by_user: 'Neo4j',
   url: 'http://www.neo4j.com',
   tags: ['neo4j', 'database', 'NoSQL'],
   likes: 750
},

上記のコレクションから、各ユーザーが作成したチュートリアルの数を示すリストを表示する場合は、次を使用します。 aggregate() 方法−

> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{
   "result" : [
      {
         "_id" : "tutorials point",
         "num_tutorial" : 2
      },
      {
         "_id" : "Neo4j",
         "num_tutorial" : 1
      }
   ],
   "ok" : 1
}
>

上記のユースケースのSQLと同等のクエリは次のようになります select by_user, count(*) from mycol group by by_user

上記の例では、ドキュメントをフィールドごとにグループ化しています by_userそして、by_userが発生するたびに、sumの以前の値が増分されます。以下は、使用可能な集計式のリストです。

説明
$ sum コレクション内のすべてのドキュメントから定義された値を合計します。 db.mycol.aggregate([{$ group:{_ id: "$by_user", num_tutorial : {$合計: "$ likes"}}}])
$ avg コレクション内のすべてのドキュメントから指定されたすべての値の平均を計算します。 db.mycol.aggregate([{$group : {_id : "$by_user "、num_tutorial:{$avg : "$いいね "}}}])
$ min コレクション内のすべてのドキュメントから対応する値の最小値を取得します。 db.mycol.aggregate([{$ group:{_ id: "$by_user", num_tutorial : {$min: "$ likes"}}}])
$ max コレクション内のすべてのドキュメントから対応する値の最大値を取得します。 db.mycol.aggregate([{$group : {_id : "$by_user "、num_tutorial:{$max : "$いいね "}}}])
$ push 結果のドキュメントの配列に値を挿入します。 db.mycol.aggregate([{$ group:{_ id: "$by_user", url : {$プッシュ: "$ url"}}}])
$ addToSet 結果のドキュメントの配列に値を挿入しますが、重複は作成しません。 db.mycol.aggregate([{$group : {_id : "$by_user "、url:{$addToSet : "$url "}}}])
$ first グループ化に従って、ソースドキュメントから最初のドキュメントを取得します。通常、これは、以前に適用された「$ sort」ステージと一緒にのみ意味があります。 db.mycol.aggregate([{$group : {_id : "$by_user "、first_url:{$first : "$url "}}}])
$ last グループ化に従って、ソースドキュメントから最後のドキュメントを取得します。通常、これは、以前に適用された「$ sort」ステージと一緒にのみ意味があります。 db.mycol.aggregate([{$group : {_id : "$by_user "、last_url:{$last : "$url "}}}])

パイプラインの概念

UNIXコマンドでは、シェルパイプラインとは、ある入力に対して操作を実行し、その出力を次のコマンドの入力として使用する可能性を意味します。MongoDBは、集約フレームワークでも同じ概念をサポートしています。可能なステージのセットがあり、それらのそれぞれが入力としてドキュメントのセットとして取得され、結果のドキュメントのセット(またはパイプラインの最後で最終的に結果のJSONドキュメント)を生成します。これは、次のステージなどに使用できます。

以下は、集約フレームワークで可能な段階です。

  • $project −コレクションから特定のフィールドを選択するために使用されます。

  • $match −これはフィルタリング操作であるため、次のステージへの入力として提供されるドキュメントの量を減らすことができます。

  • $group −これは、上記のように実際の集計を行います。

  • $sort −ドキュメントを並べ替えます。

  • $skip −これにより、指定された量のドキュメントのドキュメントのリストをスキップすることができます。

  • $limit −これにより、現在の位置から始まる指定された数だけ、表示するドキュメントの量が制限されます。

  • $unwind−これは、配列を使用しているドキュメントを巻き戻すために使用されます。配列を使用する場合、データは一種の事前結合されており、この操作はこれで元に戻され、個々のドキュメントが再び作成されます。したがって、この段階では、次の段階のドキュメントの量を増やします。

レプリケーションは、複数のサーバー間でデータを同期するプロセスです。レプリケーションは冗長性を提供し、異なるデータベースサーバー上のデータの複数のコピーでデータの可用性を向上させます。レプリケーションは、単一のサーバーの損失からデータベースを保護します。レプリケーションを使用すると、ハードウェア障害やサービスの中断から回復することもできます。データのコピーを追加すると、ディザスタリカバリ、レポート、またはバックアップ専用に1つを割り当てることができます。

なぜレプリケーションなのか?

  • データを安全に保つため
  • データの高い(24 * 7)可用性
  • 災害からの回復
  • メンテナンスのためのダウンタイムなし(バックアップ、インデックスの再構築、圧縮など)
  • 読み取りスケーリング(読み取り元の追加コピー)
  • レプリカセットはアプリケーションに対して透過的です

MongoDBでのレプリケーションのしくみ

MongoDBは、レプリカセットを使用してレプリケーションを実現します。レプリカセットは、mongod同じデータセットをホストするインスタンス。レプリカでは、1つのノードがすべての書き込み操作を受け取るプライマリノードです。セカンダリなどの他のすべてのインスタンスは、プライマリからの操作を適用して、同じデータセットを持つようにします。レプリカセットには、プライマリノードを1つだけ含めることができます。

  • レプリカセットは、2つ以上のノードのグループです(通常、最低3つのノードが必要です)。

  • レプリカセットでは、1つのノードがプライマリノードで、残りのノードがセカンダリです。

  • すべてのデータはプライマリノードからセカンダリノードに複製されます。

  • 自動フェイルオーバーまたはメンテナンス時に、プライマリの選出が確立され、新しいプライマリノードが選出されます。

  • 障害が発生したノードが回復した後、再びレプリカセットに参加し、セカンダリノードとして機能します。

クライアントアプリケーションが常にプライマリノードと対話し、プライマリノードがデータをセカンダリノードにレプリケートする、MongoDBレプリケーションの一般的な図を示します。

レプリカセットの機能

  • Nノードのクラスター
  • 任意の1つのノードをプライマリにすることができます
  • すべての書き込み操作はプライマリに送られます
  • 自動フェイルオーバー
  • 自動回復
  • プライマリーのコンセンサス選挙

レプリカセットを設定する

このチュートリアルでは、スタンドアロンのMongoDBインスタンスをレプリカセットに変換します。レプリカセットに変換するには、次の手順に従います-

  • すでに実行中のMongoDBサーバーをシャットダウンします。

  • --replSetオプションを指定して、MongoDBサーバーを起動します。以下は--replSet−の基本的な構文です。

mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"

mongod --port 27017 --dbpath "D:\set up\mongodb\data" --replSet rs0
  • ポート27017で、rs0という名前のmongodインスタンスを開始します。

  • ここでコマンドプロンプトを開始し、このmongodインスタンスに接続します。

  • Mongoクライアントで、コマンドを発行します rs.initiate() 新しいレプリカセットを開始します。

  • レプリカセットの設定を確認するには、コマンドを発行します rs.conf()。レプリカセットのステータスを確認するには、コマンドを発行しますrs.status()

レプリカセットにメンバーを追加する

レプリカセットにメンバーを追加するには、複数のマシンでmongodインスタンスを起動します。次に、mongoクライアントを起動し、コマンドを発行しますrs.add()

構文

の基本構文 rs.add() コマンドは次のとおりです-

>rs.add(HOST_NAME:PORT)

あなたのmongodインスタンス名が mongod1.net そしてそれはポートで実行されています 27017。このインスタンスをレプリカセットに追加するには、コマンドを発行しますrs.add() Mongoクライアントで。

>rs.add("mongod1.net:27017")
>

プライマリノードに接続している場合にのみ、mongodインスタンスをレプリカセットに追加できます。プライマリに接続されているかどうかを確認するには、コマンドを発行しますdb.isMaster() mongoクライアントで。

シャーディングは、複数のマシンにまたがってデータレコードを保存するプロセスであり、データ増加の要求を満たすためのMongoDBのアプローチです。データのサイズが大きくなると、1台のマシンではデータを保存したり、許容可能な読み取りおよび書き込みスループットを提供したりするのに十分でない場合があります。シャーディングは、水平スケーリングの問題を解決します。シャーディングを使用すると、データの増加と読み取りおよび書き込み操作の要求をサポートするマシンを追加できます。

なぜシャーディング?

  • レプリケーションでは、すべての書き込みはマスターノードに送られます
  • レイテンシーに敏感なクエリは引き続きマスターに送られます
  • 単一のレプリカセットには12ノードの制限があります
  • アクティブなデータセットが大きい場合、メモリを十分に大きくすることはできません
  • ローカルディスクが十分に大きくありません
  • 垂直スケーリングは高すぎる

MongoDBでのシャーディング

次の図は、シャーディングされたクラスターを使用したMongoDBでのシャーディングを示しています。

次の図では、3つの主要なコンポーネントがあります-

  • Shards−シャードはデータの保存に使用されます。これらは、高可用性とデータの整合性を提供します。実稼働環境では、各シャードは個別のレプリカセットです。

  • Config Servers−構成サーバーはクラスターのメタデータを保管します。このデータには、クラスターのデータセットのシャードへのマッピングが含まれています。クエリルーターはこのメタデータを使用して、特定のシャードに操作をターゲティングします。実稼働環境では、シャードクラスターには正確に3つの構成サーバーがあります。

  • Query Routers−クエリルーターは基本的にmongoインスタンスであり、クライアントアプリケーションとインターフェイスし、適切なシャードに操作を指示します。クエリルーターは、操作を処理してシャードにターゲティングし、結果をクライアントに返します。シャードクラスターには、クライアント要求の負荷を分割するために複数のクエリルーターを含めることができます。クライアントは1つのクエリルーターにリクエストを送信します。一般に、シャードクラスターには多くのクエリルーターがあります。

この章では、MongoDBでバックアップを作成する方法を説明します。

MongoDBデータをダンプする

MongoDBでデータベースのバックアップを作成するには、次を使用する必要があります mongodumpコマンド。このコマンドは、サーバーのデータ全体をダンプディレクトリにダンプします。データ量を制限したり、リモートサーバーのバックアップを作成したりできるオプションは多数あります。

構文

の基本構文 mongodump コマンドは次のとおりです-

>mongodump

mongodサーバーを起動します。mongodサーバーがローカルホストとポート27017で実行されていると仮定して、コマンドプロンプトを開き、mongodbインスタンスのbinディレクトリに移動して、コマンドを入力しますmongodump

mycolコレクションに次のデータがあるとします。

>mongodump

コマンドは、で実行されているサーバーに接続します 127.0.0.1 とポート 27017 サーバーのすべてのデータをディレクトリに戻します /bin/dump/。以下はコマンドの出力です-

以下は、で使用できる利用可能なオプションのリストです。 mongodump コマンド。

構文 説明
mongodump --host HOST_NAME --port PORT_NUMBER このコマンドは、指定されたmongodインスタンスのすべてのデータベースをバックアップします。 mongodump --host tutorialspoint.com --port 27017
mongodump --dbpath DB_PATH --out BACKUP_DIRECTORY このコマンドは、指定されたパスにある指定されたデータベースのみをバックアップします。 mongodump --dbpath / data / db / --out / data / backup /
mongodump --collection COLLECTION --db DB_NAME このコマンドは、指定されたデータベースの指定されたコレクションのみをバックアップします。 mongodump --collection mycol --db test

データを復元する

バックアップデータを復元するにはMongoDBの mongorestoreコマンドが使用されます。このコマンドは、バックアップディレクトリからすべてのデータを復元します。

構文

の基本構文 mongorestore コマンドは−

>mongorestore

以下はコマンドの出力です-

MongoDBデプロイメントを準備するときは、アプリケーションが本番環境でどのように維持されるかを理解するようにしてください。展開環境を管理するための一貫性のある反復可能なアプローチを開発することをお勧めします。これにより、本番環境に移行した後の予期しない事態を最小限に抑えることができます。

最善のアプローチには、セットアップのプロトタイピング、負荷テストの実施、主要なメトリックの監視、およびその情報を使用したセットアップのスケーリングが含まれます。このアプローチの重要な部分は、システム全体をプロアクティブに監視することです。これにより、本番システムが展開前にどのように維持されるかを理解し、容量を追加する必要がある場所を判断できます。たとえば、メモリ使用量の潜在的な急増について洞察を得ると、開始前に書き込みロックの起動を解除するのに役立ちます。

デプロイメントを監視するために、MongoDBは次のコマンドのいくつかを提供します-

モンゴスタット

このコマンドは、実行中のすべてのmongodインスタンスのステータスをチェックし、データベース操作のカウンターを返します。これらのカウンターには、挿入、クエリ、更新、削除、およびカーソルが含まれます。コマンドは、ページフォールトが発生したときにも表示され、ロックの割合を示します。これは、メモリが不足しているか、書き込み容量に達しているか、パフォーマンスの問題があることを意味します。

コマンドを実行するには、mongodインスタンスを起動します。別のコマンドプロンプトで、bin mongodbインストールのディレクトリとタイプ mongostat

D:\set up\mongodb\bin>mongostat

以下はコマンドの出力です-

モンゴトップ

このコマンドは、コレクションベースでMongoDBインスタンスの読み取りおよび書き込みアクティビティを追跡および報告します。デフォルトでは、mongotop毎秒情報を返しますが、それに応じて情報を変更できます。この読み取りおよび書き込みアクティビティがアプリケーションの意図と一致していること、および一度にデータベースへの書き込みが多すぎたり、ディスクからの読み取りが多すぎたり、ワーキングセットのサイズを超えていないことを確認する必要があります。

コマンドを実行するには、mongodインスタンスを起動します。別のコマンドプロンプトで、bin mongodbインストールのディレクトリとタイプ mongotop

D:\set up\mongodb\bin>mongotop

以下はコマンドの出力です-

変更するには mongotop 情報を返す頻度を減らすコマンド。mongotopコマンドの後に特定の番号を指定します。

D:\set up\mongodb\bin>mongotop 30

上記の例では、30秒ごとに値が返されます。

MongoDBツールとは別に、10genは、無料のホスト型監視サービスであるMongoDB Management Service(MMS)を提供します。これは、ダッシュボードを提供し、クラスター全体からのメトリックのビューを提供します。

この章では、MongoDBJDBCドライバーのセットアップ方法を学習します。

インストール

JavaプログラムでMongoDBの使用を開始する前に、MongoDBJDBCドライバーとJavaがマシンにセットアップされていることを確認する必要があります。マシンへのJavaのインストールについては、Javaチュートリアルを確認できます。それでは、MongoDBJDBCドライバーのセットアップ方法を確認しましょう。

  • パスDownloadmongo.jarからjarをダウンロードする必要があります。必ず最新リリースをダウンロードしてください。

  • クラスパスにmongo.jarを含める必要があります。

データベースに接続する

データベースに接続するには、データベース名を指定する必要があります。データベースが存在しない場合、MongoDBはデータベースを自動的に作成します。

以下は、データベースに接続するためのコードスニペットです-

import com.mongodb.client.MongoDatabase; 
import com.mongodb.MongoClient; 
import com.mongodb.MongoCredential;  

public class ConnectToDB { 
   
   public static void main( String args[] ) {  
      
      // Creating a Mongo client 
      MongoClient mongo = new MongoClient( "localhost" , 27017 ); 
   
      // Creating Credentials 
      MongoCredential credential; 
      credential = MongoCredential.createCredential("sampleUser", "myDb", 
         "password".toCharArray()); 
      System.out.println("Connected to the database successfully");  
      
      // Accessing the database 
      MongoDatabase database = mongo.getDatabase("myDb"); 
      System.out.println("Credentials ::"+ credential);     
   } 
}

それでは、上記のプログラムをコンパイルして実行し、以下に示すようにデータベースmyDbを作成しましょう。

$javac ConnectToDB.java 
$java ConnectToDB

実行すると、上記のプログラムは次の出力を提供します。

Connected to the database successfully 
Credentials ::MongoCredential{
   mechanism = null, 
   userName = 'sampleUser', 
   source = 'myDb', 
   password = <hidden>, 
   mechanismProperties = {}
}

コレクションを作成する

コレクションを作成するには、 createCollection() の方法 com.mongodb.client.MongoDatabase クラスが使用されます。

以下は、コレクションを作成するためのコードスニペットです-

import com.mongodb.client.MongoDatabase; 
import com.mongodb.MongoClient; 
import com.mongodb.MongoCredential;  

public class CreatingCollection { 
   
   public static void main( String args[] ) {  
      
      // Creating a Mongo client 
      MongoClient mongo = new MongoClient( "localhost" , 27017 ); 
     
      // Creating Credentials 
      MongoCredential credential; 
      credential = MongoCredential.createCredential("sampleUser", "myDb", 
         "password".toCharArray()); 
      System.out.println("Connected to the database successfully");  
      
      //Accessing the database 
      MongoDatabase database = mongo.getDatabase("myDb");  
      
      //Creating a collection 
      database.createCollection("sampleCollection"); 
      System.out.println("Collection created successfully"); 
   } 
}

コンパイルすると、上記のプログラムは次の結果をもたらします-

Connected to the database successfully 
Collection created successfully

コレクションの取得/選択

データベースからコレクションを取得/選択するには、 getCollection() の方法 com.mongodb.client.MongoDatabase クラスが使用されます。

以下は、コレクションを取得/選択するプログラムです-

import com.mongodb.client.MongoCollection; 
import com.mongodb.client.MongoDatabase; 

import org.bson.Document; 
import com.mongodb.MongoClient; 
import com.mongodb.MongoCredential;  

public class selectingCollection { 
   
   public static void main( String args[] ) {  
      
      // Creating a Mongo client 
      MongoClient mongo = new MongoClient( "localhost" , 27017 ); 
     
      // Creating Credentials 
      MongoCredential credential; 
      credential = MongoCredential.createCredential("sampleUser", "myDb", 
         "password".toCharArray()); 
      System.out.println("Connected to the database successfully");  
      
      // Accessing the database 
      MongoDatabase database = mongo.getDatabase("myDb");  
      
      // Creating a collection 
      System.out.println("Collection created successfully"); 

      // Retieving a collection
      MongoCollection<Document> collection = database.getCollection("myCollection"); 
      System.out.println("Collection myCollection selected successfully"); 
   }
}

コンパイルすると、上記のプログラムは次の結果をもたらします-

Connected to the database successfully 
Collection created successfully 
Collection myCollection selected successfully

ドキュメントを挿入する

ドキュメントをMongoDBに挿入するには、 insert() の方法 com.mongodb.client.MongoCollection クラスが使用されます。

以下は、ドキュメントを挿入するためのコードスニペットです-

import com.mongodb.client.MongoCollection; 
import com.mongodb.client.MongoDatabase; 

import org.bson.Document;  
import com.mongodb.MongoClient; 
import com.mongodb.MongoCredential;  

public class InsertingDocument { 
   
   public static void main( String args[] ) {  
      
      // Creating a Mongo client 
      MongoClient mongo = new MongoClient( "localhost" , 27017 ); 

      // Creating Credentials 
      MongoCredential credential; 
      credential = MongoCredential.createCredential("sampleUser", "myDb", 
         "password".toCharArray()); 
      System.out.println("Connected to the database successfully");  
      
      // Accessing the database 
      MongoDatabase database = mongo.getDatabase("myDb"); 

      // Retrieving a collection
      MongoCollection<Document> collection = database.getCollection("sampleCollection"); 
      System.out.println("Collection sampleCollection selected successfully");

      Document document = new Document("title", "MongoDB") 
      .append("id", 1)
      .append("description", "database") 
      .append("likes", 100) 
      .append("url", "http://www.tutorialspoint.com/mongodb/") 
      .append("by", "tutorials point");  
      collection.insertOne(document); 
      System.out.println("Document inserted successfully");     
   } 
}

コンパイルすると、上記のプログラムは次の結果をもたらします-

Connected to the database successfully 
Collection sampleCollection selected successfully 
Document inserted successfully

すべてのドキュメントを取得する

コレクションからすべてのドキュメントを選択するには、 find() の方法 com.mongodb.client.MongoCollectionクラスが使用されます。このメソッドはカーソルを返すため、このカーソルを繰り返す必要があります。

以下は、すべてのドキュメントを選択するプログラムです-

import com.mongodb.client.FindIterable; 
import com.mongodb.client.MongoCollection; 
import com.mongodb.client.MongoDatabase;  

import java.util.Iterator; 
import org.bson.Document; 
import com.mongodb.MongoClient; 
import com.mongodb.MongoCredential;  

public class RetrievingAllDocuments { 
   
   public static void main( String args[] ) {  
      
      // Creating a Mongo client 
      MongoClient mongo = new MongoClient( "localhost" , 27017 ); 

      // Creating Credentials 
      MongoCredential credential;
      credential = MongoCredential.createCredential("sampleUser", "myDb", 
         "password".toCharArray()); 
      System.out.println("Connected to the database successfully");  
      
      // Accessing the database 
      MongoDatabase database = mongo.getDatabase("myDb");  
      
      // Retrieving a collection 
      MongoCollection<Document> collection = database.getCollection("sampleCollection");
      System.out.println("Collection sampleCollection selected successfully"); 

      // Getting the iterable object 
      FindIterable<Document> iterDoc = collection.find(); 
      int i = 1; 

      // Getting the iterator 
      Iterator it = iterDoc.iterator(); 
    
      while (it.hasNext()) {  
         System.out.println(it.next());  
      i++; 
      }
   } 
}

コンパイルすると、上記のプログラムは次の結果をもたらします-

Document{{
   _id = 5967745223993a32646baab8, 
   title = MongoDB, 
   id = 1, 
   description = database, 
   likes = 100, 
   url = http://www.tutorialspoint.com/mongodb/, by = tutorials point
}}  
Document{{
   _id = 7452239959673a32646baab8, 
   title = RethinkDB, 
   id = 2, 
   description = database, 
   likes = 200, 
   url = http://www.tutorialspoint.com/rethinkdb/, by = tutorials point
}}

ドキュメントの更新

コレクションからドキュメントを更新するには、 updateOne() の方法 com.mongodb.client.MongoCollection クラスが使用されます。

以下は、最初のドキュメントを選択するプログラムです-

import com.mongodb.client.FindIterable; 
import com.mongodb.client.MongoCollection; 
import com.mongodb.client.MongoDatabase; 
import com.mongodb.client.model.Filters; 
import com.mongodb.client.model.Updates; 

import java.util.Iterator; 
import org.bson.Document;  
import com.mongodb.MongoClient; 
import com.mongodb.MongoCredential;  

public class UpdatingDocuments { 
   
   public static void main( String args[] ) {  
      
      // Creating a Mongo client 
      MongoClient mongo = new MongoClient( "localhost" , 27017 ); 
     
      // Creating Credentials 
      MongoCredential credential; 
      credential = MongoCredential.createCredential("sampleUser", "myDb", 
         "password".toCharArray()); 
      System.out.println("Connected to the database successfully");  
      
      // Accessing the database 
      MongoDatabase database = mongo.getDatabase("myDb"); 

      // Retrieving a collection 
      MongoCollection<Document> collection = database.getCollection("sampleCollection");
      System.out.println("Collection myCollection selected successfully"); 

      collection.updateOne(Filters.eq("id", 1), Updates.set("likes", 150));       
      System.out.println("Document update successfully...");  
      
      // Retrieving the documents after updation 
      // Getting the iterable object
      FindIterable<Document> iterDoc = collection.find(); 
      int i = 1; 

      // Getting the iterator 
      Iterator it = iterDoc.iterator(); 

      while (it.hasNext()) {  
         System.out.println(it.next());  
         i++; 
      }     
   }  
}

コンパイルすると、上記のプログラムは次の結果をもたらします-

Document update successfully... 
Document {{
   _id = 5967745223993a32646baab8, 
   title = MongoDB, 
   id = 1, 
   description = database, 
   likes = 150, 
   url = http://www.tutorialspoint.com/mongodb/, by = tutorials point
}}

ドキュメントを削除する

コレクションからドキュメントを削除するには、を使用する必要があります deleteOne() の方法 com.mongodb.client.MongoCollection クラス。

以下は、ドキュメントを削除するプログラムです-

import com.mongodb.client.FindIterable; 
import com.mongodb.client.MongoCollection; 
import com.mongodb.client.MongoDatabase; 
import com.mongodb.client.model.Filters;  

import java.util.Iterator; 
import org.bson.Document; 
import com.mongodb.MongoClient; 
import com.mongodb.MongoCredential;  

public class DeletingDocuments { 
   
   public static void main( String args[] ) {  
   
      // Creating a Mongo client 
      MongoClient mongo = new MongoClient( "localhost" , 27017 );
      
      // Creating Credentials 
      MongoCredential credential; 
      credential = MongoCredential.createCredential("sampleUser", "myDb", 
         "password".toCharArray()); 
      System.out.println("Connected to the database successfully");  
      
      // Accessing the database 
      MongoDatabase database = mongo.getDatabase("myDb"); 

      // Retrieving a collection
      MongoCollection<Document> collection = database.getCollection("sampleCollection");
      System.out.println("Collection sampleCollection selected successfully"); 

      // Deleting the documents 
      collection.deleteOne(Filters.eq("id", 1)); 
      System.out.println("Document deleted successfully...");  
      
      // Retrieving the documents after updation 
      // Getting the iterable object 
      FindIterable<Document> iterDoc = collection.find(); 
      int i = 1; 

      // Getting the iterator 
      Iterator it = iterDoc.iterator(); 

      while (it.hasNext()) {  
         System.out.println("Inserted Document: "+i);  
         System.out.println(it.next());  
         i++; 
      }       
   } 
}

コンパイルすると、上記のプログラムは次の結果をもたらします-

Connected to the database successfully 
Collection sampleCollection selected successfully 
Document deleted successfully...

コレクションの削除

データベースからコレクションを削除するには、を使用する必要があります drop() の方法 com.mongodb.client.MongoCollection クラス。

以下は、コレクションを削除するプログラムです-

import com.mongodb.client.MongoCollection; 
import com.mongodb.client.MongoDatabase;  

import org.bson.Document;  
import com.mongodb.MongoClient; 
import com.mongodb.MongoCredential;  

public class DropingCollection { 
   
   public static void main( String args[] ) {  

      // Creating a Mongo client 
      MongoClient mongo = new MongoClient( "localhost" , 27017 ); 

      // Creating Credentials 
      MongoCredential credential; 
      credential = MongoCredential.createCredential("sampleUser", "myDb", 
         "password".toCharArray()); 
      System.out.println("Connected to the database successfully");  
      
      // Accessing the database 
      MongoDatabase database = mongo.getDatabase("myDb");  
      
      // Creating a collection 
      System.out.println("Collections created successfully"); 

      // Retieving a collection
      MongoCollection<Document> collection = database.getCollection("sampleCollection");

      // Dropping a Collection 
      collection.drop(); 
      System.out.println("Collection dropped successfully");
   } 
}

コンパイルすると、上記のプログラムは次の結果をもたらします-

Connected to the database successfully 
Collection sampleCollection selected successfully 
Collection dropped successfully

すべてのコレクションの一覧表示

データベース内のすべてのコレクションを一覧表示するには、を使用する必要があります listCollectionNames() の方法 com.mongodb.client.MongoDatabase クラス。

以下は、データベースのすべてのコレクションを一覧表示するプログラムです。

import com.mongodb.client.MongoDatabase; 
import com.mongodb.MongoClient; 
import com.mongodb.MongoCredential;  

public class ListOfCollection { 
   
   public static void main( String args[] ) {  
      
      // Creating a Mongo client 
      MongoClient mongo = new MongoClient( "localhost" , 27017 ); 

      // Creating Credentials 
      MongoCredential credential; 
      credential = MongoCredential.createCredential("sampleUser", "myDb", 
         "password".toCharArray()); 

      System.out.println("Connected to the database successfully");  
      
      // Accessing the database 
      MongoDatabase database = mongo.getDatabase("myDb"); 
      System.out.println("Collection created successfully"); 
      for (String name : database.listCollectionNames()) { 
         System.out.println(name); 
      } 
   }
}

コンパイルすると、上記のプログラムは次の結果をもたらします-

Connected to the database successfully 
Collection created successfully 
myCollection 
myCollection1 
myCollection5

残りのMongoDBメソッド save(), limit(), skip(), sort() などは、後続のチュートリアルで説明されているのと同じように機能します。

PHPでMongoDBを使用するには、MongoDBPHPドライバーを使用する必要があります。URLからドライバーをダウンロードします。PHPドライバーをダウンロードします。必ず最新リリースをダウンロードしてください。次に、アーカイブを解凍し、php_mongo.dllをPHP拡張ディレクトリ(デフォルトでは「ext」)に配置し、php.iniファイルに次の行を追加します-

extension = php_mongo.dll

接続してデータベースを選択する

接続を確立するには、データベース名を指定する必要があります。データベースが存在しない場合、MongoDBはデータベースを自動的に作成します。

以下は、データベースに接続するためのコードスニペットです-

<?php
   // connect to mongodb
   $m = new MongoClient();
	
   echo "Connection to database successfully";
   // select a database
   $db = $m->mydb;
	
   echo "Database mydb selected";
?>

プログラムを実行すると、次の結果が生成されます-

Connection to database successfully
Database mydb selected

コレクションを作成する

以下は、コレクションを作成するためのコードスニペットです-

<?php
   // connect to mongodb
   $m = new MongoClient(); echo "Connection to database successfully"; // select a database $db = $m->mydb; echo "Database mydb selected"; $collection = $db->createCollection("mycol");
   echo "Collection created succsessfully";
?>

プログラムを実行すると、次の結果が生成されます-

Connection to database successfully
Database mydb selected
Collection created succsessfully

ドキュメントを挿入する

ドキュメントをMongoDBに挿入するには、 insert() メソッドが使用されます。

以下は、ドキュメントを挿入するためのコードスニペットです-

<?php
   // connect to mongodb
   $m = new MongoClient();
   echo "Connection to database successfully";
	
   // select a database
   $db = $m->mydb;
   echo "Database mydb selected";
   $collection = $db->mycol;
   echo "Collection selected succsessfully";
	
   $document = array( "title" => "MongoDB", "description" => "database", "likes" => 100, "url" => "http://www.tutorialspoint.com/mongodb/", "by" => "tutorials point" ); $collection->insert($document);
   echo "Document inserted successfully";
?>

プログラムを実行すると、次の結果が生成されます-

Connection to database successfully
Database mydb selected
Collection selected succsessfully
Document inserted successfully

すべてのドキュメントを検索

コレクションからすべてのドキュメントを選択するには、find()メソッドを使用します。

以下は、すべてのドキュメントを選択するためのコードスニペットです-

<?php
   // connect to mongodb
   $m = new MongoClient();
   echo "Connection to database successfully";
	
   // select a database
   $db = $m->mydb;
   echo "Database mydb selected";
   $collection = $db->mycol;
   echo "Collection selected succsessfully";

   $cursor = $collection->find();
   // iterate cursor to display title of documents
	
   foreach ($cursor as $document) {
      echo $document["title"] . "\n";
   }
?>

プログラムを実行すると、次の結果が生成されます-

Connection to database successfully
Database mydb selected
Collection selected succsessfully {
   "title": "MongoDB"
}

ドキュメントを更新する

ドキュメントを更新するには、update()メソッドを使用する必要があります。

次の例では、挿入されたドキュメントのタイトルを次のように更新します。 MongoDB Tutorial。以下は、ドキュメントを更新するためのコードスニペットです-

<?php
   // connect to mongodb
   $m = new MongoClient();
   echo "Connection to database successfully";
	
   // select a database
   $db = $m->mydb;
   echo "Database mydb selected";
   $collection = $db->mycol;
   echo "Collection selected succsessfully";

   // now update the document
   $collection->update(array("title"=>"MongoDB"), array('$set'=>array("title"=>"MongoDB Tutorial")));
   echo "Document updated successfully";
	
   // now display the updated document
   $cursor = $collection->find();
	
   // iterate cursor to display title of documents
   echo "Updated document";
	
   foreach ($cursor as $document) {
      echo $document["title"] . "\n";
   }
?>

プログラムを実行すると、次の結果が生成されます-

Connection to database successfully
Database mydb selected
Collection selected succsessfully
Document updated successfully
Updated document {
   "title": "MongoDB Tutorial"
}

ドキュメントを削除する

ドキュメントを削除するには、remove()メソッドを使用する必要があります。

次の例では、タイトルのあるドキュメントを削除します MongoDB Tutorial。以下は、ドキュメントを削除するためのコードスニペットです-

<?php
   // connect to mongodb
   $m = new MongoClient();
   echo "Connection to database successfully";
	
   // select a database
   $db = $m->mydb;
   echo "Database mydb selected";
   $collection = $db->mycol;
   echo "Collection selected succsessfully";
   
   // now remove the document
   $collection->remove(array("title"=>"MongoDB Tutorial"),false); echo "Documents deleted successfully"; // now display the available documents $cursor = $collection->find(); // iterate cursor to display title of documents echo "Updated document"; foreach ($cursor as $document) { echo $document["title"] . "\n";
   }
?>

プログラムを実行すると、次の結果が生成されます-

Connection to database successfully
Database mydb selected
Collection selected succsessfully
Documents deleted successfully

上記の例では、2番目のパラメーターはブール型であり、 justOne の分野 remove() 方法。

残りのMongoDBメソッド findOne(), save(), limit(), skip(), sort() などは、上記で説明したのと同じように機能します。

MongoDBの関係は、さまざまなドキュメントが互いに論理的にどのように関連しているかを表します。関係は、を介してモデル化できますEmbedded そして Referencedアプローチ。このような関係は、1:1、1:N、N:1、またはN:Nのいずれかになります。

ユーザーのアドレスを保存する場合を考えてみましょう。したがって、1人のユーザーが複数のアドレスを持つことができ、これを1:Nの関係にします。

以下は、のサンプルドキュメント構造です。 user ドキュメント-

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "name": "Tom Hanks",
   "contact": "987654321",
   "dob": "01-01-1991"
}

以下は、のサンプルドキュメント構造です。 address ドキュメント-

{
   "_id":ObjectId("52ffc4a5d85242602e000000"),
   "building": "22 A, Indiana Apt",
   "pincode": 123456,
   "city": "Los Angeles",
   "state": "California"
}

埋め込まれた関係のモデリング

埋め込みアプローチでは、住所ドキュメントをユーザードキュメント内に埋め込みます。

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin",
   "address": [
      {
         "building": "22 A, Indiana Apt",
         "pincode": 123456,
         "city": "Los Angeles",
         "state": "California"
      },
      {
         "building": "170 A, Acropolis Apt",
         "pincode": 456789,
         "city": "Chicago",
         "state": "Illinois"
      }
   ]
}

このアプローチでは、関連するすべてのデータが1つのドキュメントに保持されるため、取得と保守が簡単になります。ドキュメント全体は、次のような1つのクエリで取得できます。

>db.users.findOne({"name":"Tom Benzamin"},{"address":1})

上記のクエリでは、 db そして users それぞれデータベースとコレクションです。

欠点は、埋め込まれたドキュメントのサイズが大きくなりすぎると、読み取り/書き込みのパフォーマンスに影響を与える可能性があることです。

参照関係のモデリング

これは、正規化された関係を設計するアプローチです。このアプローチでは、ユーザードキュメントと住所ドキュメントの両方が別々に維持されますが、ユーザードキュメントには、住所ドキュメントを参照するフィールドが含まれます。id フィールド。

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin",
   "address_ids": [
      ObjectId("52ffc4a5d85242602e000000"),
      ObjectId("52ffc4a5d85242602e000001")
   ]
}

上に示したように、ユーザードキュメントには配列フィールドが含まれています address_ids対応するアドレスのObjectIdが含まれています。これらのObjectIdを使用して、住所ドキュメントをクエリし、そこから住所の詳細を取得できます。このアプローチでは、2つのクエリが必要になります。最初にフェッチするaddress_ids からのフィールド user ドキュメントと2番目にこれらのアドレスをフェッチします address コレクション。

>var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1})
>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})

MongoDB関係の最後の章で見たように、MongoDBで正規化されたデータベース構造を実装するには、次の概念を使用します。 Referenced Relationships とも呼ばれます Manual References参照されたドキュメントのIDを他のドキュメント内に手動で保存します。ただし、ドキュメントにさまざまなコレクションからの参照が含まれている場合は、MongoDB DBRefs

DBRefとマニュアルリファレンス

手動参照の代わりにDBRefを使用するシナリオの例として、さまざまなコレクション(address_home、address_office、address_mailingなど)にさまざまなタイプのアドレス(自宅、オフィス、郵送など)を格納しているデータベースについて考えてみます。さて、userコレクションのドキュメントはアドレスを参照します。また、アドレスタイプに基づいて調査するコレクションを指定する必要があります。ドキュメントが多くのコレクションのドキュメントを参照するようなシナリオでは、DBRefを使用する必要があります。

DBRefの使用

DBRefには3つのフィールドがあります-

  • $ref −このフィールドは、参照されるドキュメントのコレクションを指定します

  • $id −このフィールドは、参照されるドキュメントの_idフィールドを指定します

  • $db −これはオプションのフィールドであり、参照されるドキュメントが存在するデータベースの名前が含まれます

DBRefフィールドを持つサンプルユーザードキュメントについて考えてみます。 address コードスニペットに示されているように-

{
   "_id":ObjectId("53402597d852426020000002"),
   "address": {
   "$ref": "address_home", "$id": ObjectId("534009e4d852427820000002"),
   "$db": "tutorialspoint"},
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin"
}

ザ・ address ここのDBRefフィールドは、参照先住所ドキュメントがにあることを指定します address_home 下のコレクション tutorialspoint データベースであり、IDは534009e4d852427820000002です。

次のコードは、によって指定されたコレクションを動的に検索します。 $ref パラメータ(address_home 私たちの場合)によって指定されたIDを持つドキュメントの場合 $id DBRefのパラメータ。

>var user = db.users.findOne({"name":"Tom Benzamin"})
>var dbRef = user.address
>db[dbRef.$ref].findOne({"_id":(dbRef.$id)})

上記のコードは、に存在する次のアドレスドキュメントを返します address_home コレクション−

{
   "_id" : ObjectId("534009e4d852427820000002"),
   "building" : "22 A, Indiana Apt",
   "pincode" : 123456,
   "city" : "Los Angeles",
   "state" : "California"
}

この章では、対象となるクエリについて学習します。

対象クエリとは何ですか?

公式のMongoDBドキュメントによると、対象となるクエリは次のようなクエリです。

  • クエリのすべてのフィールドはインデックスの一部です。
  • クエリで返されるすべてのフィールドは同じインデックスにあります。

クエリに存在するすべてのフィールドはインデックスの一部であるため、MongoDBはクエリ条件に一致し、実際にドキュメントの内部を調べることなく、同じインデックスを使用して結果を返します。インデックスはRAMに存在するため、ドキュメントをスキャンしてデータをフェッチする場合に比べて、インデックスからデータをフェッチする方がはるかに高速です。

対象クエリの使用

対象となるクエリをテストするには、次のドキュメントを検討してください。 users コレクション−

{
   "_id": ObjectId("53402597d852426020000002"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "gender": "M",
   "name": "Tom Benzamin",
   "user_name": "tombenzamin"
}

まず、の複合インデックスを作成します users フィールド上のコレクション gender そして user_name 次のクエリを使用する-

>db.users.ensureIndex({gender:1,user_name:1})

これで、このインデックスは次のクエリをカバーします-

>db.users.find({gender:"M"},{user_name:1,_id:0})

つまり、上記のクエリの場合、MongoDBはデータベースドキュメントを調べません。代わりに、非常に高速なインデックス付きデータから必要なデータをフェッチします。

私たちのインデックスには含まれていないので _idMongoDBはデフォルトですべてのクエリで_idフィールドを返すため、フィールドはクエリの結果セットから明示的に除外しました。したがって、次のクエリは、上記で作成されたインデックス内ではカバーされていません。

>db.users.find({gender:"M"},{user_name:1})

最後に、次の場合、インデックスはクエリをカバーできないことに注意してください。

  • インデックス付きフィールドのいずれかが配列です
  • インデックス付きフィールドのいずれかがサブドキュメントです

クエリの分析は、データベースとインデックスの設計がどれほど効果的であるかを測定する上で非常に重要な側面です。よく使うものを学びます$explain そして $hint クエリ。

$ explainの使用

ザ・ $explain演算子は、クエリ、クエリで使用されるインデックス、およびその他の統計に関する情報を提供します。インデックスがどの程度最適化されているかを分析するときに非常に役立ちます。

前の章では、すでにインデックスを作成しました users フィールドのコレクション gender そして user_name 次のクエリを使用する-

>db.users.ensureIndex({gender:1,user_name:1})

これから使用します $explain 次のクエリで-

>db.users.find({gender:"M"},{user_name:1,_id:0}).explain()

上記のexplain()クエリは、次の分析結果を返します-

{
   "cursor" : "BtreeCursor gender_1_user_name_1",
   "isMultiKey" : false,
   "n" : 1,
   "nscannedObjects" : 0,
   "nscanned" : 1,
   "nscannedObjectsAllPlans" : 0,
   "nscannedAllPlans" : 1,
   "scanAndOrder" : false,
   "indexOnly" : true,
   "nYields" : 0,
   "nChunkSkips" : 0,
   "millis" : 0,
   "indexBounds" : {
      "gender" : [
         [
            "M",
            "M"
         ]
      ],
      "user_name" : [
         [
            {
               "$minElement" : 1 }, { "$maxElement" : 1
            }
         ]
      ]
   }
}

この結果セットのフィールドを見てみましょう-

  • の真の価値 indexOnly このクエリがインデックスを使用したことを示します。

  • ザ・ cursorフィールドは、使用されるカーソルのタイプを指定します。BTreeCursorタイプは、インデックスが使用されたことを示し、使用されたインデックスの名前も示します。BasicCursorは、インデックスを使用せずにフルスキャンが行われたことを示します。

  • n 一致するドキュメントが返された数を示します。

  • nscannedObjects スキャンされたドキュメントの総数を示します。

  • nscanned スキャンされたドキュメントまたはインデックスエントリの総数を示します。

$ hintの使用

ザ・ $hint演算子は、クエリオプティマイザに、指定されたインデックスを使用してクエリを実行するように強制します。これは、さまざまなインデックスを使用してクエリのパフォーマンスをテストする場合に特に便利です。たとえば、次のクエリはフィールドのインデックスを指定しますgender そして user_name このクエリに使用される-

>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})

$ explainを使用して上記のクエリを分析するには-

>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1}).explain()

不可分操作のモデルデータ

アトミック性を維持するために推奨されるアプローチは、関連するすべての情報を保持することです。これは、を使用して1つのドキュメントで頻繁に一緒に更新されます。 embedded documents。これにより、1つのドキュメントのすべての更新がアトミックになります。

次の製品ドキュメントを検討してください-

{
   "_id":1,
   "product_name": "Samsung S3",
   "category": "mobiles",
   "product_total": 5,
   "product_available": 3,
   "product_bought_by": [
      {
         "customer": "john",
         "date": "7-Jan-2014"
      },
      {
         "customer": "mark",
         "date": "8-Jan-2014"
      }
   ]
}

このドキュメントでは、製品を購入した顧客の情報を product_bought_byフィールド。これで、新しい顧客が製品を購入するたびに、最初に製品がまだ利用可能かどうかを確認します。product_availableフィールド。可能な場合は、product_availableフィールドの値を減らし、新しい顧客の埋め込みドキュメントをproduct_bought_byフィールドに挿入します。我々は使用するだろうfindAndModify 同じ方法でドキュメントを検索および更新するため、この機能のコマンド。

>db.products.findAndModify({ 
   query:{_id:2,product_available:{$gt:0}}, 
   update:{ 
      $inc:{product_available:-1}, $push:{product_bought_by:{customer:"rob",date:"9-Jan-2014"}} 
   }    
})

埋め込みドキュメントとfindAndModifyクエリを使用するという私たちのアプローチでは、製品が利用可能な場合にのみ、製品の購入情報が更新されます。そして、同じクエリ内にあるこのトランザクション全体はアトミックです。

これとは対照的に、製品の入手可能性と製品の購入者に関する情報を別々に保持している可能性があるシナリオを検討してください。この場合、最初のクエリを使用して、製品が利用可能かどうかを最初に確認します。次に、2番目のクエリで購入情報を更新します。ただし、これら2つのクエリの実行の間に、他のユーザーが製品を購入し、使用できなくなった可能性があります。これを知らなくても、2番目のクエリは、最初のクエリの結果に基づいて購入情報を更新します。これにより、入手できない製品を販売したため、データベースの一貫性が失われます。

次のドキュメントを検討してください users コレクション−

{
   "address": {
      "city": "Los Angeles",
      "state": "California",
      "pincode": "123"
   },
   "tags": [
      "music",
      "cricket",
      "blogs"
   ],
   "name": "Tom Benzamin"
}

上記のドキュメントには、 address sub-documenttags array

配列フィールドのインデックス付け

ユーザーのタグに基づいてユーザードキュメントを検索するとします。このために、コレクション内のタグ配列にインデックスを作成します。

配列にインデックスを作成すると、そのフィールドごとに個別のインデックスエントリが作成されます。したがって、この場合、tags配列にインデックスを作成すると、音楽、クリケット、ブログの値に対して個別のインデックスが作成されます。

タグ配列にインデックスを作成するには、次のコードを使用します-

>db.users.ensureIndex({"tags":1})

インデックスを作成した後、次のようにコレクションのタグフィールドを検索できます-

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

適切なインデックスが使用されていることを確認するには、次を使用します explain コマンド-

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

上記のコマンドの結果、「cursor」:「BtreeCursortags_1」が生成され、適切なインデックスが使用されていることが確認されます。

サブドキュメントフィールドのインデックス作成

都市、州、およびピンコードのフィールドに基づいてドキュメントを検索するとします。これらのフィールドはすべて住所サブドキュメントフィールドの一部であるため、サブドキュメントのすべてのフィールドにインデックスを作成します。

サブドキュメントの3つのフィールドすべてにインデックスを作成するには、次のコードを使用します-

>db.users.ensureIndex({"address.city":1,"address.state":1,"address.pincode":1})

インデックスが作成されると、次のようにこのインデックスを利用してサブドキュメントフィールドのいずれかを検索できます。

>db.users.find({"address.city":"Los Angeles"})

クエリ式は、指定されたインデックスの順序に従う必要があることに注意してください。したがって、上記で作成されたインデックスは、次のクエリをサポートします-

>db.users.find({"address.city":"Los Angeles","address.state":"California"})

次のクエリもサポートします-

>db.users.find({"address.city":"LosAngeles","address.state":"California",
   "address.pincode":"123"})

この章では、インデックスの制限とその他のコンポーネントについて学習します。

余分なオーバーヘッド

すべてのインデックスはある程度のスペースを占めるだけでなく、挿入、更新、削除のたびにオーバーヘッドが発生します。したがって、コレクションを読み取り操作に使用することがめったにない場合は、インデックスを使用しないのが理にかなっています。

RAM使用量

インデックスはRAMに保存されるため、インデックスの合計サイズがRAMの制限を超えないようにする必要があります。合計サイズがRAMサイズを増やすと、一部のインデックスの削除が開始され、パフォーマンスが低下します。

クエリの制限

−を使用するクエリではインデックス作成は使用できません

  • のような正規表現または否定演算子 $nin, $ないなど。
  • $ modなどの算術演算子。
  • $ where句

したがって、クエリのインデックスの使用状況を確認することを常にお勧めします。

インデックスキーの制限

バージョン2.6以降、既存のインデックスフィールドの値がインデックスキーの制限を超えた場合、MongoDBはインデックスを作成しません。

インデックスキー制限を超えるドキュメントの挿入

このドキュメントのインデックス付きフィールド値がインデックスキーの制限を超えた場合、MongoDBはインデックス付きコレクションにドキュメントを挿入しません。mongorestoreおよびmongoimportユーティリティの場合も同様です。

最大範囲

  • コレクションは64を超えるインデックスを持つことはできません。
  • インデックス名の長さは125文字を超えることはできません。
  • 複合インデックスには、最大31個のフィールドにインデックスを付けることができます。

これまでのすべての章でMongoDBオブジェクトIDを使用してきました。この章では、ObjectIdの構造を理解します。

アン ObjectId 次の構造を持つ12バイトのBSONタイプです-

  • UNIXエポックからの秒数を表す最初の4バイト
  • 次の3バイトはマシン識別子です
  • 次の2バイトは process id
  • 最後の3バイトはランダムなカウンター値です

MongoDBは、ObjectIdsをのデフォルト値として使用します _id各ドキュメントのフィールド。ドキュメントの作成中に生成されます。ObjectIdの複雑な組み合わせにより、すべての_idフィールドが一意になります。

新しいObjectIdの作成

新しいObjectIdを生成するには、次のコードを使用します-

>newObjectId = ObjectId()

上記のステートメントは、次の一意に生成されたIDを返しました-

ObjectId("5349b4ddd2781d08c09890f3")

MongoDBがObjectIdを生成する代わりに、12バイトのIDを指定することもできます-

>myObjectId = ObjectId("5349b4ddd2781d08c09890f4")

ドキュメントのタイムスタンプの作成

_id ObjectIdはデフォルトで4バイトのタイムスタンプを格納するため、ほとんどの場合、ドキュメントの作成時刻を格納する必要はありません。getTimestampメソッドを使用してドキュメントの作成時間を取得できます-

>ObjectId("5349b4ddd2781d08c09890f4").getTimestamp()

これにより、このドキュメントの作成時刻がISO日付形式で返されます-

ISODate("2014-04-12T21:49:17Z")

ObjectIdを文字列に変換する

場合によっては、文字列形式のObjectIdの値が必要になることがあります。ObjectIdを文字列に変換するには、次のコードを使用します-

>newObjectId.str

上記のコードは、GUIDの文字列形式を返します-

5349b4ddd2781d08c09890f3

MongoDBのドキュメントによると、 Map-reduceは、大量のデータを有用な集計結果に凝縮するためのデータ処理パラダイムです。MongoDBはmapReducemap-reduce操作のコマンド。MapReduceは通常、大きなデータセットを処理するために使用されます。

MapReduceコマンド

以下は、基本的なmapReduceコマンドの構文です-

>db.collection.mapReduce(
   function() {emit(key,value);},  //map function
   function(key,values) {return reduceFunction}, {   //reduce function
      out: collection,
      query: document,
      sort: document,
      limit: number
   }
)

map-reduce関数は、最初にコレクションを照会し、次に結果ドキュメントをマップしてキーと値のペアを発行します。次に、複数の値を持つキーに基づいて削減されます。

上記の構文では-

  • map 値をキーにマップし、キーと値のペアを出力するjavascript関数です。

  • reduce 同じキーを持つすべてのドキュメントを削減またはグループ化するJavaScript関数です

  • out map-reduceクエリ結果の場所を指定します

  • query ドキュメントを選択するためのオプションの選択基準を指定します

  • sort オプションのソート基準を指定します

  • limit 返されるドキュメントのオプションの最大数を指定します

MapReduceの使用

ユーザーの投稿を保存する次のドキュメント構造について考えてみます。ドキュメントには、ユーザーのuser_nameと投稿のステータスが保存されます。

{
   "post_text": "tutorialspoint is an awesome website for tutorials",
   "user_name": "mark",
   "status":"active"
}

次に、mapReduce関数を使用します posts コレクションを使用してすべてのアクティブな投稿を選択し、user_nameに基づいてグループ化し、次のコードを使用して各ユーザーによる投稿の数をカウントします-

>db.posts.mapReduce( 
   function() { emit(this.user_id,1); }, 
	
   function(key, values) {return Array.sum(values)}, {  
      query:{status:"active"},  
      out:"post_total" 
   }
)

上記のmapReduceクエリは次の結果を出力します-

{
   "result" : "post_total",
   "timeMillis" : 9,
   "counts" : {
      "input" : 4,
      "emit" : 4,
      "reduce" : 2,
      "output" : 2
   },
   "ok" : 1,
}

結果は、合計4つのドキュメントがクエリに一致し(ステータス:「アクティブ」)、map関数がキーと値のペアを持つ4つのドキュメントを発行し、最後にreduce関数が同じキーを持つマップされたドキュメントを2にグループ化したことを示しています。

このmapReduceクエリの結果を確認するには、検索演算子-を使用します

>db.posts.mapReduce( 
   function() { emit(this.user_id,1); }, 
   function(key, values) {return Array.sum(values)}, {  
      query:{status:"active"},  
      out:"post_total" 
   }
	
).find()

上記のクエリは、両方のユーザーが tom そして mark アクティブな状態の2つの投稿がある-

{ "_id" : "tom", "value" : 2 }
{ "_id" : "mark", "value" : 2 }

同様に、MapReduceクエリを使用して、大規模で複雑な集計クエリを作成できます。カスタムJavascript関数を使用すると、非常に柔軟で強力なMapReduceが使用されます。

バージョン2.4から、MongoDBは文字列コンテンツ内を検索するためのテキストインデックスのサポートを開始しました。ザ・Text Search ステミング技術を使用して、次のようなステミングストップワードをドロップすることにより、文字列フィールドで指定された単語を検索します a, an, the, など。現在、MongoDBは約15の言語をサポートしています。

テキスト検索の有効化

当初、テキスト検索は実験的な機能でしたが、バージョン2.6以降、構成はデフォルトで有効になっています。ただし、以前のバージョンのMongoDBを使用している場合は、次のコードでテキスト検索を有効にする必要があります-

>db.adminCommand({setParameter:true,textSearchEnabled:true})

テキストインデックスの作成

以下のドキュメントを検討してください posts 投稿テキストとそのタグを含むコレクション-

{
   "post_text": "enjoy the mongodb articles on tutorialspoint",
   "tags": [
      "mongodb",
      "tutorialspoint"
   ]
}

post_textフィールドにテキストインデックスを作成して、投稿のテキスト内を検索できるようにします-

>db.posts.ensureIndex({post_text:"text"})

テキストインデックスの使用

post_textフィールドにテキストインデックスを作成したので、次の単語を含むすべての投稿を検索します tutorialspoint 彼らのテキストで。

>db.posts.find({$text:{$search:"tutorialspoint"}})

上記のコマンドは、次の単語を含む結果ドキュメントを返しました tutorialspoint 彼らの投稿テキストで-

{ 
   "_id" : ObjectId("53493d14d852429c10000002"), 
   "post_text" : "enjoy the mongodb articles on tutorialspoint", 
   "tags" : [ "mongodb", "tutorialspoint" ]
}
{
   "_id" : ObjectId("53493d1fd852429c10000003"), 
   "post_text" : "writing tutorials on mongodb",
   "tags" : [ "mongodb", "tutorial" ] 
}

古いバージョンのMongoDBを使用している場合は、次のコマンドを使用する必要があります-

>db.posts.runCommand("text",{search:" tutorialspoint "})

テキスト検索を使用すると、通常の検索と比較して検索効率が大幅に向上します。

テキストインデックスの削除

既存のテキストインデックスを削除するには、最初に次のクエリを使用してインデックスの名前を見つけます-

>db.posts.getIndexes()

上記のクエリからインデックスの名前を取得したら、次のコマンドを実行します。ここに、post_text_text インデックスの名前です。

>db.posts.dropIndex("post_text_text")

正規表現は、任意の文字列内のパターンまたは単語を検索するために、すべての言語で頻繁に使用されます。MongoDBは、を使用した文字列パターンマッチングのための正規表現の機能も提供します。$regexオペレーター。MongoDBは、正規表現言語としてPCRE(Perl互換正規表現)を使用します。

テキスト検索とは異なり、正規表現を使用するために構成やコマンドを実行する必要はありません。

以下のドキュメント構造を検討してください。 posts 投稿テキストとそのタグを含むコレクション-

{
   "post_text": "enjoy the mongodb articles on tutorialspoint",
   "tags": [
      "mongodb",
      "tutorialspoint"
   ]
}

正規表現の使用

次の正規表現クエリは、文字列を含むすべての投稿を検索します tutorialspoint その中で-

>db.posts.find({post_text:{$regex:"tutorialspoint"}})

同じクエリを次のように記述することもできます-

>db.posts.find({post_text:/tutorialspoint/})

大文字と小文字を区別しない正規表現の使用

大文字と小文字を区別しないようにするために、 $options 値を持つパラメータ $i。次のコマンドは、次の単語を含む文字列を検索しますtutorialspoint、小さい場合や大文字の場合に関係なく-

>db.posts.find({post_text:{$regex:"tutorialspoint",$options:"$i"}})

このクエリから返される結果の1つは、次の単語を含むドキュメントです。 tutorialspoint さまざまな場合-

{
   "_id" : ObjectId("53493d37d852429c10000004"),
   "post_text" : "hey! this is my post on TutorialsPoint", 
   "tags" : [ "tutorialspoint" ]
}

配列要素に正規表現を使用する

配列フィールドで正規表現の概念を使用することもできます。これは、タグの機能を実装するときに特に重要です。したがって、tutorialという単語(tutorialまたはtutorialsまたはtutorialpointまたはtutorialphp)で始まるタグを持つすべての投稿を検索する場合は、次のコードを使用できます-

>db.posts.find({tags:{$regex:"tutorial"}})

正規表現クエリの最適化

  • ドキュメントフィールドが indexed、クエリは正規表現に一致するようにインデックス値を使用します。これにより、コレクション全体をスキャンする正規表現と比較して、検索が非常に高速になります。

  • 正規表現が prefix expression、すべての一致は、特定の文字列文字で始まることを意図しています。たとえば、正規表現が^tut、次に、クエリはで始まる文字列のみを検索する必要があります tut

RockMongoは、サーバー、データベース、コレクション、ドキュメント、インデックスなどを管理できるMongoDB管理ツールです。これは、ドキュメントの読み取り、書き込み、および作成のための非常にユーザーフレンドリーな方法を提供します。これは、PHPおよびMySQL用のPHPMyAdminツールに似ています。

RockMongoのダウンロード

RockMongoの最新バージョンはここからダウンロードできます。 https://github.com/iwind/rockmongo

RockMongoのインストール

ダウンロードしたら、サーバーのルートフォルダーにあるパッケージを解凍し、抽出したフォルダーの名前を次のように変更できます。 rockmongo。任意のWebブラウザーを開き、index.phprockmongoフォルダーのページ。ユーザー名/パスワードとしてそれぞれadmin / adminを入力します。

RockMongoの操作

RockMongoで実行できるいくつかの基本的な操作を見ていきます。

新しいデータベースの作成

新しいデータベースを作成するには、をクリックします Databasesタブ。クリックCreate New Database。次の画面で、新しいデータベースの名前を入力し、をクリックしますCreate。左側のパネルに新しいデータベースが追加されているのがわかります。

新しいコレクションの作成

データベース内に新しいコレクションを作成するには、左側のパネルからそのデータベースをクリックします。クリックしてくださいNew Collection上のリンク。コレクションに必要な名前を入力します。Is Capped、Size、Maxの他のフィールドについては心配しないでください。クリックCreate。新しいコレクションが作成され、左側のパネルに表示されます。

新しいドキュメントの作成

新しいドキュメントを作成するには、ドキュメントを追加するコレクションをクリックします。コレクションをクリックすると、そこにリストされているそのコレクション内のすべてのドキュメントを表示できます。新しいドキュメントを作成するには、をクリックしますInsert上部のリンク。ドキュメントのデータをJSONまたは配列形式で入力し、をクリックすることができますSave

データのエクスポート/インポート

コレクションのデータをインポート/エクスポートするには、そのコレクションをクリックしてから、をクリックします。 Export/Importトップパネルのリンク。次の手順に従ってデータをzip形式でエクスポートしてから、同じzipファイルをインポートしてデータをインポートし直します。

GridFSは、画像、オーディオファイル、ビデオファイルなどの大きなファイルを保存および取得するためのMongoDB仕様です。ファイルを保存するファイルシステムの一種ですが、そのデータはMongoDBコレクション内に保存されます。GridFSには、ドキュメントサイズの制限である16MBを超えるファイルを保存する機能があります。

GridFSはファイルをチャンクに分割し、データの各チャンクをそれぞれ最大サイズ255kの個別のドキュメントに保存します。

GridFSはデフォルトで2つのコレクションを使用します fs.files そして fs.chunksファイルのメタデータとチャンクを保存します。各チャンクは、一意の_idObjectIdフィールドによって識別されます。fs.filesは親ドキュメントとして機能します。ザ・files_id fs.chunksドキュメントのフィールドは、チャンクをその親にリンクします。

以下はfs.filesコレクションのサンプルドキュメントです-

{
   "filename": "test.txt",
   "chunkSize": NumberInt(261120),
   "uploadDate": ISODate("2014-04-13T11:32:33.557Z"),
   "md5": "7b762939321e146569b07f72c62cca4f",
   "length": NumberInt(646)
}

ドキュメントには、ファイル名、チャンクサイズ、アップロード日、および長さが指定されています。

以下はfs.chunksドキュメントのサンプルドキュメントです-

{
   "files_id": ObjectId("534a75d19f54bfec8a2fe44b"),
   "n": NumberInt(0),
   "data": "Mongo Binary Data"
}

GridFSへのファイルの追加

ここで、GridFSを使用してmp3ファイルを保存します。 putコマンド。このために、mongofiles.exe MongoDBインストールフォルダーのbinフォルダーにあるユーティリティ。

コマンドプロンプトを開き、MongoDBインストールフォルダーのbinフォルダーにあるmongofiles.exeに移動して、次のコードを入力します-

>mongofiles.exe -d gridfs put song.mp3

ここに、 gridfsファイルが保存されるデータベースの名前です。データベースが存在しない場合、MongoDBはその場で新しいドキュメントを自動的に作成します。Song.mp3は、アップロードされたファイルの名前です。データベース内のファイルのドキュメントを表示するには、findquery-を使用できます。

>db.fs.files.find()

上記のコマンドは次のドキュメントを返しました-

{
   _id: ObjectId('534a811bf8b4aa4d33fdf94d'), 
   filename: "song.mp3", 
   chunkSize: 261120, 
   uploadDate: new Date(1397391643474), md5: "e4f53379c909f7bed2e9d631e15c1c41",
   length: 10401959 
}

前のクエリで返されたドキュメントIDを使用して、次のコードで、保存されたファイルに関連するfs.chunksコレクションに存在するすべてのチャンクを確認することもできます-

>db.fs.chunks.find({files_id:ObjectId('534a811bf8b4aa4d33fdf94d')})

私の場合、クエリは40のドキュメントを返しました。これは、mp3ドキュメント全体が40のデータチャンクに分割されたことを意味します。

Capped collectionsは、作成、読み取り、および削除操作の高いパフォーマンスをサポートするために、挿入順序に従う固定サイズの循環コレクションです。循環とは、コレクションに割り当てられた固定サイズが使い果たされると、明示的なコマンドを提供せずに、コレクション内の最も古いドキュメントの削除を開始することを意味します。

キャップされたコレクションは、更新によってドキュメントサイズが増加する場合、ドキュメントの更新を制限します。上限付きコレクションは、ディスクストレージの順序でドキュメントを格納するため、ドキュメントサイズがディスクに割り当てられたサイズを増加させないようにします。上限付きコレクションは、ログ情報、キャッシュデータ、またはその他の大量のデータを格納するのに最適です。

キャップ付きコレクションの作成

上限付きコレクションを作成するには、通常のcreateCollectionコマンドを使用しますが、 capped オプションとして true コレクションの最大サイズをバイト単位で指定します。

>db.createCollection("cappedLogCollection",{capped:true,size:10000})

コレクションのサイズに加えて、コレクション内のドキュメントの数を制限することもできます。 max パラメータ-

>db.createCollection("cappedLogCollection",{capped:true,size:10000,max:1000})

コレクションに上限があるかどうかを確認する場合は、次を使用します isCapped コマンド-

>db.cappedLogCollection.isCapped()

上限付きに変換することを計画している既存のコレクションがある場合は、次のコードでそれを行うことができます-

>db.runCommand({"convertToCapped":"posts",size:10000})

このコードは、既存のコレクションを変換します posts 上限のあるコレクションに。

上限付きコレクションのクエリ

デフォルトでは、上限付きコレクションに対する検索クエリは、挿入順に結果を表示します。ただし、ドキュメントを逆の順序で取得する場合は、sort 次のコードに示すコマンド-

>db.cappedLogCollection.find().sort({$natural:-1})

知っておく価値のある上限付きコレクションに関する他の重要なポイントはほとんどありません-

  • 上限のあるコレクションからドキュメントを削除することはできません。

  • _idフィールドでも、上限付きコレクションにはデフォルトのインデックスはありません。

  • 新しいドキュメントを挿入するときに、MongoDBは実際にディスク上の新しいドキュメントを収容する場所を探す必要はありません。コレクションの最後に新しいドキュメントを盲目的に挿入できます。これにより、上限付きコレクションへの挿入操作が非常に高速になります。

  • 同様に、ドキュメントの読み取り中、MongoDBはディスクに存在するのと同じ順序でドキュメントを返します。これにより、読み取り操作が非常に高速になります。

MongoDBには、SQLデータベースのようなすぐに使用できる自動インクリメント機能はありません。デフォルトでは、12バイトのObjectIdを使用します_idドキュメントを一意に識別するための主キーとしてのフィールド。ただし、_idフィールドにObjectId以外の自動インクリメント値を設定したい場合があります。

これはMongoDBのデフォルト機能ではないため、プログラムでこの機能を実現するには、 counters MongoDBドキュメントで提案されているコレクション。

カウンターコレクションの使用

次のことを考慮してください products資料。_idフィールドをauto-incremented integer sequence 1、2、3、4からnまで。

{
  "_id":1,
  "product_name": "Apple iPhone",
  "category": "mobiles"
}

このために、を作成します counters コレクション。すべてのシーケンスフィールドの最後のシーケンス値を追跡します。

>db.createCollection("counters")

ここで、次のドキュメントをcountersコレクションに挿入します。 productid その鍵として-

{
  "_id":"productid",
  "sequence_value": 0
}

フィールド sequence_value シーケンスの最後の値を追跡します。

次のコードを使用して、このシーケンスドキュメントをcountersコレクションに挿入します-

>db.counters.insert({_id:"productid",sequence_value:0})

Javascript関数の作成

次に、関数を作成します getNextSequenceValueこれは、シーケンス名を入力として受け取り、シーケンス番号を1インクリメントして、更新されたシーケンス番号を返します。私たちの場合、シーケンス名はproductid

>function getNextSequenceValue(sequenceName){

   var sequenceDocument = db.counters.findAndModify({
      query:{_id: sequenceName },
      update: {$inc:{sequence_value:1}},
      new:true
   });
	
   return sequenceDocument.sequence_value;
}

Javascript関数の使用

ここで、関数getNextSequenceValueを使用して、新しいドキュメントを作成し、返されたシーケンス値をドキュメントの_idフィールドとして割り当てます。

次のコードを使用して2つのサンプルドキュメントを挿入します-

>db.products.insert({
   "_id":getNextSequenceValue("productid"),
   "product_name":"Apple iPhone",
   "category":"mobiles"
})

>db.products.insert({
   "_id":getNextSequenceValue("productid"),
   "product_name":"Samsung S3",
   "category":"mobiles"
})

ご覧のとおり、getNextSequenceValue関数を使用して_idフィールドの値を設定しました。

機能を確認するために、findコマンドを使用してドキュメントをフェッチしましょう-

>db.products.find()

上記のクエリは、自動インクリメントされた_idフィールドを持つ次のドキュメントを返しました-

{ "_id" : 1, "product_name" : "Apple iPhone", "category" : "mobiles"}

{ "_id" : 2, "product_name" : "Samsung S3", "category" : "mobiles" }