| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

MongoDB

提供: MyMemoWiki
2021年6月1日 (火) 14:09時点におけるPiroto (トーク | 投稿記録)による版 (→‎簡単な集計)
ナビゲーションに移動 検索に移動

MongoDB

マニュアル

ドキュメント指向データベース


スキーマレス


  • スキーマを定義しなくても利用できる
  • スキーマレスのため保守性が高い
  • JSON方式でデータを保持
  • テーブルのことはコレクションと呼ぶ

パフォーマンス


  • 機能制限により、高パフォーマンスを実現
  • トランザクションがない
    • 処理速度がかなり高速
  • 大量データの高速処理に向く
  • スケールアウトが簡単な設定で可能

操作感


  • RDBと似た操作
  • 複雑な検索条件を利用できる

インストール


Ubuntu


  1. ubuntu@puli-mon:~$ cat /etc/os-release
  2. NAME="Ubuntu"
  3. VERSION="20.04.2 LTS (Focal Fossa)"
  4. :
  5. ubuntu@puli-mon:~$ wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
  6. OK
  7. ubuntu@puli-mon:~$ echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
  8. ubuntu@puli-mon:~$ sudo apt-get update
  9. ubuntu@puli-mon:~$ sudo apt-get install -y mongodb-org
ディレクトリ

種類 場所 備考
データ /var/lib/mongodb
ログ /var/log/mongodb
設定 /etc/mongod.conf
開始

  1. ubuntu@puli-mon:/etc$ sudo systemctl start mongod
  • 失敗する場合
  1. sudo systemctl daemon-reload
リモートホストから接続

  • デフォルトでは、localhostからのみ接続可能なため、bindIp の行を変更
  • $ sudo vi /etc/mongod.conf
  1. # network interfaces
  2. net:
  3. port: 27017
  4. # bindIp: 127.0.0.1
  5. bindIp: 0.0.0.0

monogoシェルの実行


  1. ubuntu@puli-mon:/etc$ mongo
  2. MongoDB shell version v4.4.6
  3. connecting to: mongodb://127.0.0.1:27017/?
  4. :
  5. ---
  6. >

GUI

MongaDB Compass


Robo 3T


Mongodb gui t3 download.png

  • 起動

Mongodb gui t3.png

データベース

データベース作成


  • use で作成
  1. > use testdb
  2. switched to db testdb
  • db。dろpDatabase() でカレントDBを削除

コレクションを作成


  1. > db.createCollection("testDoc")
  2. { "ok" : 1 }
  • 一覧を確認
  1. > show dbs
  2. admin 0.000GB
  3. config 0.000GB
  4. local 0.000GB
  5. testdb 0.000GB

ドキュメントの登録


  • testDocは、コレクション
  1. > db.testDoc.insertOne(
  2. ... {name:"Foo",value:"Bar"}
  3. ... )
  4. {
  5. "acknowledged" : true,
  6. "insertedId" : ObjectId("609f57392efac2b731a534eb")
  7. }

検索


  • find
  1. > db.testDoc.find()
  2. { "_id" : ObjectId("609f57392efac2b731a534eb"), "name" : "Foo", "value" : "Bar" }

DB統計


  1. > db.stats()
  2. {
  3. "db" : "testdb",
  4. "collections" : 1, // コレクション数
  5. "views" : 0,
  6. "objects" : 1,
  7. "avgObjSize" : 51,
  8. "dataSize" : 51, // 圧縮前データサイズ
  9. "storageSize" : 20480,
  10. "indexes" : 1, // インデックス数
  11. "indexSize" : 20480, // インデックスデータ量
  12. "totalSize" : 40960,
  13. "scaleFactor" : 1,
  14. "fsUsedSize" : 2561937408,
  15. "fsTotalSize" : 20629221376,
  16. "ok" : 1
  17. }

コレクション

種類 コマンド
コレクションの作成 db.createCollection(コレクション名) db.createCollection("testCollection")
コレクションの一覧表示 show collections
統計情報表示 db.collection.stats()
コレクションの削除 db.collection.drop() db.testCollection.drop

Cappedコレクション


  • コレクションに入れられるデータの上限を設定
  • データ量が上限になると、古いドキュメントから削除されていく
  • レプリカセットでは、Cappedコレクションを使ってデータを同期している
  • createCollection のオプションを変更して作成
  1. db.createCollection(
  2. "コレクション名",
  3. [capped: true, size: データ上限(バイト)サイズ]
  4. )

登録

方法 コマンド
1件登録 db.collection.insertOne({...}) db.testCollection.insertOne({key:"1",value:"a"})
複数登録 db.collection.insertMany([

{...}, {...} ])

db.testCollection.insertMany([

{key:2,value:"b"}, {key:3,value:"c"} ])

検索

方法 コマンド
全件 db.collection.find() db.testCollection.find()
フィールドを指定 db.collection.find(

{検索条件}, {key1:0,kye2:1,...} ) //key1を非表示、key2を表示

db.testCollection.find(

{key:2}, {_id:0,key:1,value:1} )

完全一致 {key:value}
部分一致 {key:/value/}
前方一致 {key:/^value/}
後方一致 {key:/value$/}
以下 {key:{$lte:value}}
未満 {key:{$lt:value}}
以上 {key:{$gte:value}}
より大きい {key:{$gt:value}}
範囲指定 {key:{$gte:value1, $lte:value2}}
and {$and:[

{key1:value1}, {key2:value2} ]}

or {$or:[

{key1:value1}, {key2:value2} ]}

null {key:null}

以下が検索される 1.データ型がNull 2.フィールドなし 3.undefined

フィールドの存在有無($exists) { key: {$exists: false}}
 データ型を指定($type) {key:{$type:"null"}}

// Null型を指定して検索

ソート db.collection.find().sort({...})

// 1:昇順,-1:降順

db.testCollection.find().sort(

{key:-1} )

件数 db.collection.find().count()

更新

方法 コマンド
1件ドキュメントを更新 db.collection.updateOne(

{検索条件}, {$set:{更新内容}} )

一致するデータが複数あっても、1件しか更新されない

db.testCollection.updateOne( {key:"1"}}, {$set:{value2:"v2"}} )

複数件のドキュメントを更新 db.collection.updateMany(

{検索条件}, {$set:{更新内容}} )

更新に一致したドキュメントを全て更新

db.testCollection.updateMany( {key:{$lt:4}}, {$set:{value2:"v2"}} )

ドキュメントの置き換え db.collection.replaceOne(

{検索条件} {更新内容} )

入れ替えられるのは1件だけ

db.testCollection.replaceOne( {key:"1"}, {key:1, value:"a", value2:"v1"} )

フィールド名を変更 $rename 旧Key:"新Key" db.testCollection.updateMany(

{}, {$rename:{value:"val1"}} )

配列のインデックス フィールド名.n {$set:{"ary.3":"hoge"}}
登録または更新(upsert) db.collection.updateOne(

{検索条件}, {更新内容}, {upsert: true} )

削除

方法 コマンド
1件削除 db.collection.deleteOne({検索条件}) 複数件一致しても、削除されるのは1件
複数件削除 db.collection.deleteMany({検索条件})

集計

  • findで集計はできないため、aggregationメソッドを利用する
集計 集計関数
最大値 $max
最小値 $min
平均値 $avg

簡単な集計


  1. db.collection.aggregate([
  2. { $match:{<検索条件>}},
  3. { $group:{ _id::"$<集計フィールド>",<集計結果表示名>:{<集計関数>:"$集計フィールド"}}}
  4. ])

基本

    • $group に 指定した _id フィールドごとに集計を行う
    • "$フィールド名"と入力する
    • 集計関数 $sumを指定、複数指定も可能
  1. db.getCollection("O1").aggregate([
  2. { $match: { 'head.MakeDate.Year':{ '$gt':'2010', '$lt':'2020' }} },
  3. { $group: { _id:'$head.MakeDate.Year', tosu: {'$sum':{ '$toInt': '$TorokuTosu' }}} }
  4. ])

Mongo aggregate sum.png

グループ化のあとに、さらに条件を適用

  1. db.getCollection("O1").aggregate([
  2. { $match: { 'head.MakeDate.Year':{ '$gt':'2010', '$lt':'2020' }} },
  3. { $group: { _id:'$head.MakeDate.Year', tosu: {'$sum':{ '$toInt': '$TorokuTosu' }}} },
  4. { $match: { 'tosu' : { '$gt': 49000 }} }
  5. ])

Mongo aggregate sum2.png

集計関数を複数同時に使用

  1. db.getCollection("O1").aggregate([
  2. { $match: { 'head.MakeDate.Year':{ '$gt':'2010', '$lt':'2020' }} },
  3. { $group: { _id:'$head.MakeDate.Year',
  4. tosu_total: {'$sum':{ '$toInt': '$TorokuTosu' }},
  5. tosu_max: {'$max':{ '$toInt': '$TorokuTosu' }},
  6. tosu_min: {'$min':{ '$toInt': '$TorokuTosu' }},
  7. tosu_avg: {'$avg':{ '$toInt': '$TorokuTosu' }} }}
  8. ])

Tips

stringをintに変換

  1. db.getCollection('O1').find({},{tosu:{ '$toInt': '$TorokuTosu' }})

Mongo to into.png

プログラミング

C#


Insert


  1. using MongoDB.Driver;
  2. :
  3. var client = new MongoClient("mongodb://puli-mon.local");
  4. var mongoDb = client.GetDatabase("jra");
  5. var colH1 = mongoDb.GetCollection<JV_H1_HYOSU_ZENKAKE>("h1");
  6. :
  7. colH1.InsertOne(rec);