mongodb
差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| mongodb [2012/12/22 15:59] – nullpon | mongodb [2020/02/26 02:55] (現在) – [リレーショナルDBとの差異] nullpon | ||
|---|---|---|---|
| 行 12: | 行 12: | ||
| |トランザクション|あり|なし| | |トランザクション|あり|なし| | ||
| - | MongoDBのドキュメントはBSON(Binary JSON)形式で保存される。JSONで定義されているデータ(オブジェクト・配列・文字列・数値・真偽値・null)と日付(ISODate)を保存できる。トランザクションは存在しないがドキュメント単位でアトミックな操作が保証されている。 | + | MongoDBのドキュメントはBSON(Binary JSON)形式で保存される。JSONで定義されているデータ(オブジェクト・配列・文字列・数値・真偽値・null)と日付(ISODate)、バイナリを保存できる。 |
| + | トランザクションは存在しないがドキュメント単位でアトミックな操作が保証されている。ロックもドキュメント単位で行われる(mongoDB 3.0以降のwiredTigerエンジン使用時) | ||
| ===== インストール ===== | ===== インストール ===== | ||
| MacOSX | MacOSX | ||
| 行 23: | 行 24: | ||
| $ sudo port load mongodb | $ sudo port load mongodb | ||
| | | ||
| + | |||
| ===== 起動 ===== | ===== 起動 ===== | ||
| 自身の権限で起動してみる | 自身の権限で起動してみる | ||
| 行 30: | 行 32: | ||
| dbpathはデータ保存場所、自身の権限で起動するので自分のホームディレクトリ以下のなど書き込み可能な適当な場所を指定する。dbpathのデフォルトは /data/db 。保存場所が存在しない場合や、読み書き権限が無い場合は起動に失敗するので予め作成しておく。デフォルトでPort 27017を使用する。 | dbpathはデータ保存場所、自身の権限で起動するので自分のホームディレクトリ以下のなど書き込み可能な適当な場所を指定する。dbpathのデフォルトは /data/db 。保存場所が存在しない場合や、読み書き権限が無い場合は起動に失敗するので予め作成しておく。デフォルトでPort 27017を使用する。 | ||
| + | Linuxでは、 **xfs でフォーマットされたディスク上のディレクトリ**を dbpath とする事。特に3系(WiredTiger)では必須、ext4ではパフォーマンスと安定性がかなり損なわれるため production環境では特に注意してください。ext4でサービスインしてひどい目にあっている話もちらほら聞きます。 | ||
| ===== インタラクティブシェル ===== | ===== インタラクティブシェル ===== | ||
| 行 96: | 行 99: | ||
| db.CollectionB.find({ a_code: a.code }); | db.CollectionB.find({ a_code: a.code }); | ||
| | | ||
| + | ===== ObjectId ===== | ||
| + | |||
| + | ObjectIDは先頭4バイトがUNIX Timeなので、ドキュメントが時間フィールドを持っていなくても index を使った時間指定の範囲検索が可能 | ||
| + | |||
| + | |||
| + | <code javascript> | ||
| + | var start = Math.floor(new Date(2015, 0, 1, 0, 0, 0).getTime() / 1000); | ||
| + | var end = Math.floor(new Date(2015, 0, 1, 23, 59, 59).getTime() / 1000); | ||
| + | |||
| + | // mongo shellの場合 | ||
| + | var start = ObjectId(start.toString(16) + ' | ||
| + | var end = ObjectId(end.toString(16) + ' | ||
| + | |||
| + | db.HogeHoge.find({_id: | ||
| + | |||
| + | // node-mongodb-nativeの場合 | ||
| + | var start = ObjectID.createFromTime(start); | ||
| + | var end = ObjectID.createFromTime(end); | ||
| + | |||
| + | collection.find({_id: | ||
| + | // ... | ||
| + | }); | ||
| + | </ | ||
| + | ===== インデックス ===== | ||
| + | |||
| + | * B-Tree Index | ||
| + | * 注意点はRDBとほぼ同じ | ||
| + | * _idは常にIndexを持つ | ||
| + | |||
| + | 作成 | ||
| + | |||
| + | < | ||
| + | db.collection.createIndex({fieldName: | ||
| + | </ | ||
| + | |||
| + | ==== TTL Index ==== | ||
| + | |||
| + | TTL Indexを指定すると、指定した時間が過ぎるとドキュメントが削除される。Webアプリケーションのセッションデータの格納、一定期間だけ残したいログの保存などに向いている | ||
| + | |||
| + | 制限 | ||
| + | |||
| + | * インデックスを指定するフィールドはdate型の値でなくてはならない | ||
| + | * 複合インデックスはサポートしない | ||
| + | * Capped Collectionには指定できない | ||
| + | * あとから追加することも可能、ただしそのフィールドに既に通常のインデックスがある場合は作れない。インデックスを削除すればOK | ||
| + | |||
| + | |||
| + | 例)3ヶ月ログを残す | ||
| + | < | ||
| + | db.OperationLog.createIndex({ " | ||
| + | |||
| + | // ログ追加 | ||
| + | db.OperationLog.insert({createdDate: | ||
| + | </ | ||
| + | |||
| + | |||
| + | 例)3600秒間更新がなければ削除する | ||
| + | |||
| + | < | ||
| + | db.UserSession.createIndex( { " | ||
| + | |||
| + | // セッションを延長するため、TTL Indexフィールドを更新 | ||
| + | db.UserSession.update({_id: | ||
| + | </ | ||
| + | |||
| + | |||
| + | 例)指定した時刻に削除する | ||
| + | < | ||
| + | db.UserSession.createIndex({" | ||
| + | |||
| + | // 有効期限の切れる時刻を設定してinsertする(2016/ | ||
| + | db.OperationLog.insert({expiredDate: | ||
| + | </ | ||
| + | |||
| + | |||
| ===== 管理画面 ===== | ===== 管理画面 ===== | ||
| ブラウザでアクセスできるコンソールページ、mongodのport+1000のポートを使う。デフォルトは28017となる。 | ブラウザでアクセスできるコンソールページ、mongodのport+1000のポートを使う。デフォルトは28017となる。 | ||
| 行 107: | 行 185: | ||
| [[http:// | [[http:// | ||
| - | ===== QA ===== | + | ===== FAQ ===== |
| ==== can't do non-multi update with query that doesn' | ==== can't do non-multi update with query that doesn' | ||
| updateしようとすると、'' | updateしようとすると、'' | ||
| 行 136: | 行 214: | ||
| ※ コネクション数の上限は、mongodに接続して '' | ※ コネクション数の上限は、mongodに接続して '' | ||
| + | ==== can't upsert something without full valid shard key ==== | ||
| + | |||
| + | upsertクエリで、'' | ||
| + | |||
| + | シャーディング環境では $in による複数 id 指定などでの upsert を受け付けないので、あらかじめ指定する id のドキュメントを作っておき、update で実行する。 | ||
| + | |||
| + | |||
| + | ==== full shard key must be in update object for collection ==== | ||
| + | |||
| + | シャーディング環境のupdateクエリで発生。更新されるオブジェクトに_idが入っていないと発生する。 | ||
| + | |||
| + | <code javascript> | ||
| + | db.Collection.update({_id: | ||
| + | </ | ||
| + | |||
| + | 以下のようにすればエラーにならないが、ドキュメント全体更新は必要なデータを消してしまう危険を伴うので $setや$unsetでプロパティを指定して変更する事をお勧めする。 | ||
| + | |||
| + | <code javascript> | ||
| + | db.Collection.update({_id: | ||
| + | </ | ||
| + | |||
| + | ==== cannot use the part (hoge of hoge.fuga) to traverse the element ({hoge: 1.0}) ==== | ||
| + | |||
| + | オブジェクトではない値に対して、オブジェクトとしてアクセスしようとした | ||
| + | |||
| + | <code javascript> | ||
| + | mongos> db.Test.find({_id: | ||
| + | { " | ||
| + | mongos> db.Test.update({_id: | ||
| + | WriteResult({ | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | }) | ||
| + | </ | ||
| + | |||
| + | hogeオブジェクトのfugaプロパティを更新する操作を行ったが、hogeはオブジェクトではないためエラー | ||
mongodb.1356191999.txt.gz · 最終更新: by nullpon