9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【mongoDB】mongoDBチートシート「基本操作」

Last updated at Posted at 2020-12-27

#RDBとの用語の比較

RDB MongoDB
database database
table collection
record document
column field
index index
primary key _id フィールド

macへのインスール データ保管場所設定

brew update
brew upgrade
brew tap mongodb/brew
brew install mongodb-community
sudo mkdir -p /System/Volumes/Data/data/db
sudo chown -R `id -un` /System/Volumes/Data/data/db

###起動・状態確認・停止

brew services run mongodb-community
brew services list
brew services stop mongodb-community

###シェルの実行

mongo

#データーベース操作
###データーベースを確認する

show dbs

###データーベースを切り替える。(なかったら作成する)

use <データーベース名>

###統計情報確認

db.stats()
フィールド名 説明
collections データーベースにあるコレクションの数
dataSize 圧縮される前のデータサイズ
strageSize コレクションに割り当てられたスペースの合計サイズ。圧縮後のサイズ
indexes インデックスの数
indexSize インデックスのデータ量の合計
fileSize ストレージに保存されるファイルのサイズ

###データベースの削除

db.dropDatabase()

###データーベース名の変更
※mongodbにはデータベース名を変更する機能はない。
よって、一度別名でコピーして古い方のデーターを削除する。

db.copyDatabase("old_db", "new_db")
use old_db
db.dropDatabase()

#コレクションの操作

###データーを挿入する


db.<コレクション>.insertOne(
    {name:"taro", age:30}
    )

###全件検索

db.<コレクション>.find()

###コレクションの一覧表示

show collections

###コレクション名の変更

db.old_cl_renameCollection(new_cl, true)
//trueを指定すると古いコレクションが消去される。

###コレクションの統計情報

db.collection.stats()
フィールド名 説明
size メモリに展開される合計サイズ
count コレクションに入っているデータの件数
storageSize ストレージのサイズ
capped cappedコケクションかどうかを判定
indexes インデックスの数
totalIndexSize インデックスのデータ量の合計
IndexSizes 各インデックスのデータ量

###コレクションの削除

db.<コレクション>.drop()

###cappedコレクションの作成

db.createColleciton("<コレクション>", {capped: true, size: 1024000}

###通常のコレクションをcappedコレクションに変更する。

db.runCommand(
{"convertToCapped":"<コレクション>", size: <サイズの上限> }
)

#ドキュメントの登録

###一件だけ登録する

db.<コレクション>.insertOne(
  {key1: "value1", key2: "value2"}
  )

###複数件登録する

db.<コレクション>.insertMany([
  {key1: "value1", key2: "value3"},
  {key1: "value2", key2: "value5"},
  {key1: "value3", key2: "value6"},
  ])

###データ型の登録

db.<コレクション>.insertOne(
  {
   key1: "stringData",
   intdata: NumberLong(1),
   booleanData: true
  }
)

###配列・オブジェクトデータの登録

db.<コレクション>.insertOne(
  {
   key1: "taro",
   arrayData:["arr1", "arr2"],
   objData:{obj1: value1, obj2: "value2"}
  }
)

#ドキュメントの検索

###検索結果をインデントする。

find().pretty()

###条件指定

db.<コレクション>.find(
  {<検索条件>}, //空欄で全件選択
  {key1: 0, key2:1}
)
//0=>非表示 1=>表示

###配列の中の要素を指定して検索

db.<コレクション>.find(
  {key1:"value"},
  {"key2.propaty": 1}
)

###完全一致

db.<コレクション>.find(
  {key: "value"}
)

###部分一致

db.<コレクション>.find(
  {key: "/value/"}
)

###前方一致

db.<コレクション>.find(
  {key: "/^value/"}
)

###後方一致

db.<コレクション>.find(
  {key: "/value$/"}
)

###範囲指定

db.<コレクション>.find(
  {key: {$lte: "value"}}
)
//未満の場合は$lt
//以上の場合は$gte
//より大きいの場合は$gt
//組み合わせることにより、範囲を指定できる。

###and・or条件

db.<コレクション>.find(
  { $and:
    [
      {key1: /value$/},
      {key1: /value$/}
    ]
  }
)
//$orでor条件

###null検索ついて

nullに関数するデータ型のパターン


 {"user_id":1,"name": ""}
 {"user_id":2, "name": null}
 {"user_id":3}
 {"user_id":1, "name": undefined}
検索条件 結果
""
null ② ③ ④
$exit:false
$type:null

$typeはnull以外でも使える。また,それぞれデータ型に割り振られた番号でも可。
nullの場合は、10
https://docs.mongodb.com/manual/reference/operator/query/type/

#配列オブジェクトの値で絞り込む

サンプルデータ

collection名 「ff」

//サンプルデータ1
{
	"_id" : ObjectId("5fe7f51d8e92e9609ddd92bd"),
	"name" : "Taro",
	"age" : 20,
	"skill" : [
		"js",
		"php",
		"node",
		"mongo",
		"mysql"
	],
	"child" : [
		{
			"name" : "Jiro",
			"age" : 1
		},
		{
			"name" : "Ken",
			"age" : 3
		}
	]
}

//サンプルデータ2

{
	"_id" : ObjectId("5fe7f7378e92e9609ddd92be"),
	"name" : "Kota",
	"age" : 23,
	"skill" : [
		"aws",
		"docker",
		"linux",
		"git"
	]
}

###指定した要素数で検索する

db.ff.find(
  {skill:{$size: 5}},
)

###配列の中に、指定した値を全て持つものを検索

db.ff.find(
  {skill: {$all: ["js", "php"]}}
).pretty()

###配列の中のオブジェクトで検索

db.ff.find(
    {"child.age":3}
    ).pretty()
{
//オブジェクトの中を検索する場合は、""をつける。

###検索結果をソートする

db.ff.find(
  {},
  {_id:0}
  ).sort({ age:1 }) //この場合ageの昇順
//降順は -1を指定。

###取得件数を指定

db.ff.find().limit(2)

###件数をスキップして取得。
(この場合は、年齢の小さい二人をのぞいて、残りを取得)

db.ff.find().sort({age: 1})skip(2)

#ドキュメントの更新

###一件だけ更新

db.ff.updateOne( 
  {name: "Taro"}, 
  {$set: {age: 40}} 
)

//複数一致する条件があっても最初の一件のみ更新される。

###複数件の更新

db.ff.updataMany(
  {age: 20},
  {$set:{"age";21}}
)
//条件を指定しない場合は、全件更新

###ドキュメントを丸々入れ替える

db.ff.replaceOne(
  {name: "Taro"},
  {LastName: "Yamada", age:18}
  )
//_idはそのまま。

#フィールドを追加する。

###ドキュメントにフィールドを追加

 db.ff.updateOne( 
   {name:"Kota"}, 
   {$set: {height: 170} }
 )

###配列に要素を追加する

db.ff.updateOne( 
  {name: "Kota"}, 
  {$set: {"skill.3": "ruby"}} 
)
//オブジェクトを指定しているので""が必要
}

###オブジェクトにフィールドを追加する。

db.ff.updateOne( 
  {name:"Taro"}, 
  {$set : {"child.0.gender": "male"}} 
  )
//child配列0番目の要素にgender:"male"を追加

###フィールド名を変更する。

db.ff.updateMany(
  {},
  {$rename: {name: "lastName"}
)

###データーを登録、または更新

db.ff.updateOne{
  {name: "Taro"},
  {$set: {gender: "male"},
  {upsert: true},
  {multi: true}
)
//upesrt:一致するものがなければ、登録。あれば更新
//multi:条件に合致するもの全て更新するかどうか(指定しなけば一番最初にヒットしたもののみ更新。

###ドキュメントを一件削除する

db.ff.deletOne{
  {name: "Taro"}
)

###ドキュメントを複数削除する

db.ff.deleteMany{
  {name: "Taro"}
)

#node.jsとMongoDB連携

サーバー接続(認証なしの場合)


const MongoClient = require('mongodb').MongoClient //mongodb.MongoClientをロード

let url = 'mongodb://mongo:27017/' //  mongodb://<ホスト>:<ポート>/

const option = {
  useNewUrlParser: true,
  useUnifiedTopology: true,
}

MongoClient.connect(url, option,(error, client) => { //Promiseが返る。
  var db = client.db("sample");//sampleデーターベースをインスタンスか化
  db.createCollection("test", (error, collections) => {//処理の例
    client.close();//切断する。
  });
});

//Promiseが戻り値。

#インスタンスに対し処理を行う

##コレクション操作

###コレクションを作成する

db.cerateCollection("<collectionName>", (error, collections) => {
    client.close();
  })

###コレクションの選択

  db.collection("<collectionName>", (error, collections) => {
    client.close();
  })

###コレクションを全て取得

db.listCollections().toArray((error, items)=>{ 
  client.close();
})

###コレクション名を変更する。

db.renameCollection("old_name", "new_name", (error, collections)=>{
    client.close();
})
//collectionsは新しいコレクションが入っている。

###コレクションを削除する。

 db.dropCollection("test_old", (error) => {
    client.close();
  });

##ドキュメント操作

###ドキュメントを複数作成
(一件の場合は、insertOneで配列ではなくオブジェクトを渡す)

  //dbはdatabaseをインスタンス化したもの
  db.collection("products", (error, collection) => { //productsコレクションを選択
    collection.insertMany([
      { name: "pen", price: 120 },
      { name: "note", price: 100 }
    ], (error, result) => {
      client.close();
    });
  });

###ドキュメントの検索

db.collection("products", (error, collection) => {
    collection
      .find({ name: { $regex: /e/g } }) 
      //colleciton.find({field: {ope:"val"}})
      //promiseでないのでコールバックを呼び出さない。
      .forEach((item) => {
        console.log(item.name);
      }, (error) => {
        client.close();
      });
  });

###オペレーターの種類

ope 意味
$eq ==
$gt >
$gte >=
$lt <
$lte <=
$ne !=
$regrex 正規表現

※$eq及び$regrexは省略できる。

###ドキュメントの更新

db.collection("products", (error, collection) => {
    collection.updateMany(
      { name:{$regrex: /e/g }}, 
      //第一引数に対象の選定(完全一致と、正規表現の場合は、$regrex,$eqを省略することができる。)
      { $inc: { price: 20 } }, //$set で置き換え $incは数値が+される。
      (error, result) => { 
        client.close();
      }
    );
  });

###ドキュメントの削除

db.collection("products", (error, collection) => {
    collection.deleteMany(
      { name: /e/g },
      (error, result) => {
        client.close();
      }
    );
  });
9
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?