ユーザ用ツール

サイト用ツール


mongodb

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
mongodb [2015/05/18 09:01] – [can't upsert something without full valid shard key] nullponmongodb [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) + '0000000000000000');   // Id, not ID
 +var end = ObjectId(end.toString(16) + '0000000000000000');
 +
 +db.HogeHoge.find({_id: {$gte: start, $lte: end}});
 +
 +// node-mongodb-nativeの場合
 +var start = ObjectID.createFromTime(start);   // ID, not Id
 +var end = ObjectID.createFromTime(end);
 +
 +collection.find({_id: {$gte: start, $lte: end}}).each(function(err, item) {
 + // ...
 +});
 +</code>
    
 +===== インデックス =====
 +
 +  * B-Tree Index
 +    * 注意点はRDBとほぼ同じ
 +  * _idは常にIndexを持つ 
 +
 +作成
 +
 +<code>
 +db.collection.createIndex({fieldName: 1});
 +</code>
 +
 +==== TTL Index ====
 +
 +TTL Indexを指定すると、指定した時間が過ぎるとドキュメントが削除される。Webアプリケーションのセッションデータの格納、一定期間だけ残したいログの保存などに向いている
 +
 +制限
 +
 +  * インデックスを指定するフィールドはdate型の値でなくてはならない
 +  * 複合インデックスはサポートしない
 +  * Capped Collectionには指定できない
 +  * あとから追加することも可能、ただしそのフィールドに既に通常のインデックスがある場合は作れない。インデックスを削除すればOK
 +
 +
 +例)3ヶ月ログを残す
 +<code>
 +db.OperationLog.createIndex({ "createdDate": 1 }, { expireAfterSeconds: 60 * 60 * 24 * 90 });
 +
 +// ログ追加
 +db.OperationLog.insert({createdDate: new Date(), data: logData});
 +</code>
 +
 +
 +例)3600秒間更新がなければ削除する
 +
 +<code>
 +db.UserSession.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 3600 } )
 +
 +// セッションを延長するため、TTL Indexフィールドを更新
 +db.UserSession.update({_id: sessionId}, { $set: { lastModifiedDate: new Date() }});
 +</code>
 +
 +
 +例)指定した時刻に削除する
 +<code>
 +db.UserSession.createIndex({"expiredDate": 1}, {expireAfterSeconds: 0});
 +
 +// 有効期限の切れる時刻を設定してinsertする(2016/08/20 09:00で期限切れの場合)
 +db.OperationLog.insert({expiredDate: new Date(2016, 7, 20, 9, 0, 0), data: logData});
 +</code>
 +
 +
 ===== 管理画面 ===== ===== 管理画面 =====
 ブラウザでアクセスできるコンソールページ、mongodのport+1000のポートを使う。デフォルトは28017となる。 ブラウザでアクセスできるコンソールページ、mongodのport+1000のポートを使う。デフォルトは28017となる。
行 145: 行 223:
 ==== full shard key must be in update object for collection ==== ==== full shard key must be in update object for collection ====
  
-シャーディング環境のupdateクエリで発生、updateで$setを使わないオブジェクト全体の更新をするとエラーになる。+シャーディング環境のupdateクエリで発生。更新されるオブジェクトに_idが入っていいと発生する。
  
 <code javascript> <code javascript>
行 151: 行 229:
 </code> </code>
  
-は更新されるオブジェクト_idが入っていないため+以下のようにすばエラーならないドキュメント全体更新は必要なデータを消してしまう危険を伴うので $setや$unsetでプロパティを指定して変更する事をお勧めする。
  
 <code javascript> <code javascript>
行 157: 行 235:
 </code> </code>
  
-とすればエラーにならないドキュメン全体更新は危険なので $setや$unsetを使うことお勧めする+==== cannot use the part (hoge of hoge.fuga) to traverse the element ({hoge: 1.0}) ==== 
 + 
 +オブジェクトではない値に対してオブジェクとしてアクセスしようとした 
 + 
 +<code javascript> 
 +mongos> db.Test.find({_id: "a"}) 
 +{ "_id" : "a", "hoge" : 1 } 
 +mongos> db.Test.update({_id: "a"}, {$set: {"hoge.fuga": 1}}) 
 +WriteResult({ 
 + "nMatched" : 0, 
 + "nUpserted" : 0, 
 + "nModified" : 0, 
 + "writeError" : { 
 + "code" : 16837, 
 + "errmsg" : "cannot use the part (hoge of hoge.fuga) to traverse the element ({hoge: 1.0})" 
 +
 +}) 
 +</code> 
 + 
 +hogeオブジェクトのfugaプロパティ更新する操作を行ったが、hogeはオブジェクトではないためエラー
mongodb.1431939677.txt.gz · 最終更新: 2015/05/18 09:01 by nullpon