🐡

DocumentDB コマンドメモ(自分用)

2024/03/30に公開

前提

20240330 現在
バージョン:MongoDB 7.0

Database Commands — MongoDB Manual
https://www.mongodb.com/docs/manual/reference/command/

基本コマンド

バージョン確認

version()

▼実行結果例

rs0 [direct: primary] test> version()
2.2.2
rs0 [direct: primary] test> 

ログイン

mongosh --tls --host <DocumentDB のホスト名>:27017 --tlsCAFile global-bundle.pem  --retryWrites=false --username <ユーザー名>

▼実行結果例

EmiKitani:~/environment $ mongosh --tls --host docdb-2024-03-28-02-20-25.cluster-cxkg0swix4f0.ap-northeast-1.docdb.amazonaws.com:27017 --tlsCAFile global-bundle.pem  --retryWrites=false --username DocDBAdmin
Enter password: ***************
Current Mongosh Log ID: 6607a889a47244681d1852b6
Connecting to:          mongodb://<credentials>@docdb-2024-03-28-02-20-25.cluster-cxkg0swix4f0.ap-northeast-1.docdb.amazonaws.com:27017/?directConnection=true&tls=true&tlsCAFile=global-bundle.pem&retryWrites=false&appName=mongosh+2.2.2
Using MongoDB:          5.0.0
Using Mongosh:          2.2.2

For mongosh info see: https://docs.mongodb.com/mongodb-shell/

------
   Warning: Non-Genuine MongoDB Detected
   This server or service appears to be an emulation of MongoDB rather than an official MongoDB product.
   Some documented MongoDB features may work differently, be entirely missing or incomplete, or have unexpected performance characteristics.
   To learn more please visit: https://dochub.mongodb.org/core/non-genuine-mongodb-server-warning.
------

rs0 [direct: primary] test>

DB 操作系

データベース一覧表示

show dbs

▼実行結果例

rs0 [direct: primary] test> show dbs
test  96.00 KiB
rs0 [direct: primary] test>

データベースの作成と切り替え

use <データベース名>
  • 指定したデータベース名のデータベースが作成され、そのデータベースに切り替わる
  • データベースが既に存在する場合は、そのデータベースに切り替わる
  • データベースとコレクションは最初の書き込み操作時に自動的に作成されるため明示的に作成する必要は基本的にない

▼実行結果例

rs0 [direct: primary] test> use mydb-20240330
switched to db mydb-20240330
rs0 [direct: primary] mydb-20240330> 

コレクションを作成

db.createCollection("<コレクション名>")
  • 現在のデータベース内に指定したコレクション名のコレクションが作成される
  • データベースとコレクションは最初の書き込み操作時に自動的に作成されるため明示的に作成する必要は基本的にない

▼実行結果例

rs0 [direct: primary] mydb-20240330> db.createCollection("test-collection")
{ ok: 1 }
rs0 [direct: primary] mydb-20240330> 

データベースのコレクション一覧を表示

show collections

▼実行結果例

rs0 [direct: primary] test> show collections
collection
profiles
users
rs0 [direct: primary] test>

コレクション作成の際、オプションが指定できる(最大サイズ、ドキュメント数など)

db.createCollection("users", { capped: true, size: 1000000, max: 1000 })
  • "users"コレクションを作成し、最大サイズを 1,000,000 バイト、最大ドキュメント数を 1,000 に制限
  • コレクション名には certain 制限がある
    • 空文字列、"."、"$"、null文字は含められない
    • "system."で始まる名前は予約されている

コレクションの作成と切り替え

db.<コレクション名>.find()
  • 指定したコレクション名に切り替わる
  • コレクションが存在しない場合は、新しいコレクションが作成される

▼実行結果例

rs0 [direct: primary] mydb-20240330> db.test-collection.find()
ReferenceError: collection is not defined
rs0 [direct: primary] mydb-20240330> 
  • コレクション名に - (ハイフン) が含まれている場合、ドット表記法 db.collection.find() を使用するとエラーになる
    • JavaScript の変数名の命名規則と衝突するため
  • 次のいずれかの方法を使用

ブラケット表記法

db["test-collection"].find()

▼実行結果例

rs0 [direct: primary] mydb-20240330> db["test-collection"].find()

rs0 [direct: primary] mydb-20240330>

getCollection() メソッドを使用する:

db.getCollection("test-collection").find()

▼実行結果例

rs0 [direct: primary] mydb-20240330> db.getCollection("test-collection").find()

rs0 [direct: primary] mydb-20240330>

単一のドキュメントを挿入

db.<コレクション名>.insertOne({"hello":"DocumentDB"})

▼実行結果例

rs0 [direct: primary] mydb-20240330> db["test-collection"].insertOne({"hello":"DocumentDB"})
{
  acknowledged: true,
  insertedId: ObjectId('6607c11b5c0f5d64301852b7')
}
rs0 [direct: primary] mydb-20240330> 
  • test-collection という名前のコレクションに {"hello":"DocumentDB"} という内容のドキュメントを 1 つ挿入した

追加したレコードを表示する

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

▼実行結果例

rs0 [direct: primary] mydb-20240330> db["test-collection"].findOne()
{ _id: ObjectId('6607c11b5c0f5d64301852b7'), hello: 'DocumentDB' }
rs0 [direct: primary] mydb-20240330> 

複数のレコードを入力する

db.<コレクション名>.insertMany([
  { <field1>: <value1>, <field2>: <value2>, ... },
  { <field1>: <value1>, <field2>: <value2>, ... },
  ...
])

▼実行結果例

rs0 [direct: primary] mydb-20240330> db["test-collection"].insertMany([                  
... { "_id" : 1, "name" :"Martha Rivera", "status": "active", "level": 12, "score":202},
... { "_id" : 2, "name" :"Carlos Salazar", "status": "inactive", "level": 2, "score":9},
... { "_id" : 3, "name" :"Richard Roe", "status": "active", "level": 7, "score":87},
... { "_id" : 4, "name" :"Saanvi Sarkar", "status": "active", "level": 3, "score":27} ])
{ acknowledged: true, insertedIds: { '0': 1, '1': 2, '2': 3, '3': 4 } }
rs0 [direct: primary] mydb-20240330>

コレクション内のすべてのドキュメントを返す

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

▼実行結果例※ブラケット表記

rs0 [direct: primary] mydb-20240330> db["test-collection"].find()
[
  { _id: ObjectId('6607c11b5c0f5d64301852b7'), hello: 'DocumentDB' },
  {
    _id: 1,
    name: 'Martha Rivera',
    status: 'active',
    level: 12,
    score: 202
  },
  {
    _id: 2,
    name: 'Carlos Salazar',
    status: 'inactive',
    level: 2,
    score: 9
  },
  {
    _id: 3,
    name: 'Richard Roe',
    status: 'active',
    level: 7,
    score: 87
  },
  {
    _id: 4,
    name: 'Saanvi Sarkar',
    status: 'active',
    level: 3,
    score: 27
  }
]
rs0 [direct: primary] mydb-20240330>

フィルターを使用して単一のドキュメントに対してクエリを実行する

db.<コレクション名>.find({<field1>: <value1>})

▼実行結果※ブラケット表記

rs0 [direct: primary] mydb-20240330> db["test-collection"].find({name:"Saanvi Sarkar"})
[
  {
    _id: 4,
    name: 'Saanvi Sarkar',
    status: 'active',
    level: 3,
    score: 27
  }
]
rs0 [direct: primary] mydb-20240330> 

レコードを検索して変更する

特定のドキュメント内で value をインクリメント(増やす)例

db.profiles.findAndModify({
query: { <field1>: <value1>, <field2>: <value2>,},
update: { $inc: { <field3>:10 } } })

▼実行結果例

rs0 [direct: primary] mydb-20240330> db["test-collection"].findAndModify({
... query: { name:"Martha Rivera", status: "active"},
... update: { $inc: { score:10 } } })
{
  _id: 1,
  name: 'Martha Rivera',
  status: 'active',
  level: 12,
  score: 202
}
rs0 [direct: primary] mydb-20240330> 

この結果ではまだ反映されてない
前のコマンドからの変更を確認する

db.<コレクション名>.find({<field1>: <value1>})

▼実行結果

rs0 [direct: primary] mydb-20240330> db["test-collection"].find({name:"Martha Rivera"})
[
  {
    _id: 1,
    name: 'Martha Rivera',
    status: 'active',
    level: 12,
    score: 212
  }
]
rs0 [direct: primary] mydb-20240330> 

10ポイント増えた

ユーザー操作系

データベースのユーザー一覧を表示

show users

▼実行結果例

rs0 [direct: primary] mydb-20240330> show users
[
  {
    _id: 'serviceadmin',
    user: 'serviceadmin',
    db: 'admin',
    roles: [ { db: 'admin', role: 'root' } ]
  },
  {
    _id: 'DocDBAdmin',
    user: 'DocDBAdmin',
    db: 'admin',
    roles: [ { db: 'admin', role: 'root' } ]
  }
]
rs0 [direct: primary] mydb-20240330>

ユーザー作成

db.createUser({
  user: "<ユーザー名>",
  pwd: "<パスワード>",
  roles: [
    { role: "role1", db: "database1" },
    { role: "role2", db: "database2" }
  ]
})
  • user: ユーザー名を指定
  • pwd: ユーザーのパスワードを指定
  • roles: ユーザーに割り当てるロールを指定
    • 各ロールは、ロール名とデータベース名のペアで指定
      ▼実行結果例
rs0 [direct: primary] test> db.createUser({
...   user: "user-test",
...   pwd: "Password-Test",
...   roles: [
...     { role: "readWrite", db: "test" }
...   ]
... })
{ ok: 1, operationTime: Timestamp({ t: 1711781748, i: 1 }) }
rs0 [direct: primary] test> 
  • "user-test"ユーザーを作成
  • "user-test"は、"test"データベースに対して読み取りと書き込みの権限(readWriteロール)を持つ

ユーザーに割り当てる一般的なロールは以下

  • read: 読み取り権限
  • readWrite: 読み取りと書き込みの権限
  • dbAdmin: データベース管理者権限
  • userAdmin: ユーザー管理者権限
  • root: 全ての権限(スーパーユーザー)

ロールはカスタムで定義することもできる。

注意

  • ユーザーを作成するには、userAdminロールまたはuserAdminAnyDatabaseロールが必要
  • パスワードは、セキュリティ上の理由からプレーンテキストで指定するのではなく、シェルや環境変数から読み込む方が良い

ユーザーを切り替えるコマンド

db.auth("<ユーザー名>", "<パスワード>")

▼実行結果例

rs0 [direct: primary] test> db.auth("user-test", "Password-Test")
{ ok: 1 }
rs0 [direct: primary] test> 

現在のユーザーを表示

db.runCommand({ connectionStatus: 1 })

▼実行結果例

rs0 [direct: primary] test> db.runCommand({ connectionStatus: 1 })
{
  authInfo: {
    authenticatedUsers: [ { user: 'user-test', db: 'admin' } ],
    authenticatedUserRoles: [ { role: 'readWrite', db: 'test' } ]
  },
  ok: 1,
  operationTime: Timestamp({ t: 1711782306, i: 1 })
}
rs0 [direct: primary] test>

ユーザー一覧の表示

db.getUsers()

▼実行結果例

rs0 [direct: primary] test> db.getUsers()
{
  ok: 1,
  users: [
    {
      _id: 'serviceadmin',
      user: 'serviceadmin',
      db: 'admin',
      roles: [ { db: 'admin', role: 'root' } ]
    },
    {
      _id: 'DocDBAdmin',
      user: 'DocDBAdmin',
      db: 'admin',
      roles: [ { db: 'admin', role: 'root' } ]
    },
    {
      _id: 'user-test',
      user: 'user-test',
      db: 'admin',
      roles: [ { db: 'test', role: 'readWrite' } ]
    }
  ],
  operationTime: Timestamp({ t: 1711783167, i: 1 })
}
rs0 [direct: primary] test>

Discussion