MongoDB コレクションなどの用語と操作まとめ

スポンサーリンク

MongoDBのCollection, Documentなどの基本的な用語と操作をまとめます。RDBMSのテーブル, レコードに相当するMongoDBの概念がCollectionとDocumentです。

前提

公式ドキュメント

参考になる公式ドキュメントを以下に示します。

動作確認済環境

  • Rocky Linux 8.6
  • MongoDB Server 6.0.2

用語まとめ

MongoDBではデータの集まりをCollectionと呼びます。RDBMSのtableにほぼ相当する概念がCollectionです。

以下にRDBMSとMongoDBの似たような概念をまとめます。

RDBMS用語 MongoDB用語
database database
table collection
record(row) document
column field

操作まとめ

database

mongoshコマンドでMongoDBへ接続できます。syntaxは以下の通りです。

mongosh <db_name>

操作例を以下に示します。以下はsample01データベースに接続する操作例です。RDBMSのように明示的にCREATE DATABASEコマンドを発行する必要はありません。

データベース名を省略した場合はtestデータベースに接続されます。

[root@linux010 ~]# mongosh sample01
Current Mongosh Log ID: 634bcf8fbf75da1edb6e73d5
Connecting to:    mongodb://127.0.0.1:27017/sample01?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.6.0
Using MongoDB:    6.0.2
Using Mongosh:    1.6.0

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

------
   The server generated these startup warnings when booting
   2022-10-16T16:49:53.020+09:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
   2022-10-16T16:49:53.021+09:00: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. We suggest setting it to 'never'
   2022-10-16T16:49:53.021+09:00: vm.max_map_count is too low
------

------
   Enable MongoDB's free cloud-based monitoring service, which will then receive and display
   metrics about your deployment (disk utilization, CPU, operation statistics, etc).
   
   The monitoring data will be available on a MongoDB website with a unique URL accessible to you
   and anyone you share the URL with. MongoDB may use this information to make product
   improvements and to suggest MongoDB products and deployment options to you.
   
   To enable free monitoring, run the following command: db.enableFreeMonitoring()
   To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
------

sample01> 

“show dbs”コマンドでデータベース一覧が表示されます。このコマンドで表示されるのは、何らかのデータが存在するデータベース一覧ですので、現時点では”show dbs”の出力にsample01データベースは含まれません。

sample01> show dbs
admin   40.00 KiB
config  12.00 KiB
local   40.00 KiB
sample01> 

mongoshコマンドで接続後、操作するデータベースを変更したい場合はuseコマンドを使用します。操作例は以下の通りです。

sample01> use sample02
switched to db sample02
sample02> use sample01
switched to db sample01
sample01> 

collection

以下SyntaxでCollectionを作成できます。

db.createCollection('<collection_name>')

操作例は以下の通りです。

sample01> db.createCollection('employee')
{ ok: 1 }
sample01> 

collectionを作成すると”show dbs”にsample01データベースが含まれるようになります。

sample01> show dbs
admin     40.00 KiB
config    60.00 KiB
local     40.00 KiB
sample01   8.00 KiB
sample01> 

“show collections”コマンドでcollectionの一覧を表示できます。

sample01> show collections
employee
sample01> 

document

collectionにデータを挿入するには、以下syntaxのようなinsertOneを使用します。

db.<collection_name>.insertOne(<json_data>)

操作例は以下の通りです。

sample01> db.employee.insertOne({name:"scott",password:"tiger"})
{
  acknowledged: true,
  insertedId: ObjectId("634bd203458b9928aa1e93c5")
}
sample01> 

挿入したデータが表示できるかを確認します。全件検索ならば、以下のようなfindを使用します。

sample01> db.employee.find()
[
  {
    _id: ObjectId("634bd203458b9928aa1e93c5"),
    name: 'scott',
    password: 'tiger'
  }
]
sample01> 

collectionに含まれる全データを削除するならば、以下のように操作します。

sample01> db.employee.drop()
true
sample01> 

特殊なCollection

View

RDBMS同様に、MongoDBもViewを使用できます。Viewを作成するには、db.createViewを使用します。Syntaxは以下の通りです。

db.createViewもdb.createCollectionも同じ操作ができるsugar syntaxです。createCollectionの操作方法は「Create and Query a View」を参照ください。

db.createView(
  "<viewName>",
  "<source>",
  [<pipeline>],
  {
    "collation" : { <collation> }
  }
)

sourceが検索対象とするテーブルでSQL文のFROM句に相当するイメージです。pipelineが検索条件でSQL文のWHERE句に相当するイメージです。collationは省略可能です。

単一Collectionに対するViewの例

実Collectionを作成します。

db.students.insertMany( [
   { sID: 22001, name: "Alex", year: 1, score: 4.0 },
   { sID: 21001, name: "bernie", year: 2, score: 3.7 },
   { sID: 20010, name: "Chris", year: 3, score: 2.5 },
   { sID: 22021, name: "Drew", year: 1, score: 3.2 },
   { sID: 17301, name: "harley", year: 6, score: 3.1 },
   { sID: 21022, name: "Farmer", year: 1, score: 2.2 },
   { sID: 20020, name: "george", year: 3, score: 2.8 },
   { sID: 18020, name: "Harley", year: 5, score: 2.8 },
] )

1年生を抽出するViewの例を示します。

db.createView(
   "firstYears",
   "students",
   [ { $match: { year: 1 } } ],
   { collation: { locale: "en", caseFirst: "upper" } }
)

4年を超過する生徒を抽出するViewの例を示します。

db.createView(
   "graduateStudents",
   "students",
   [ { $match: { $expr: { $gt: [ "$year", 4 ] } } } ],
   { collation: { locale: "en", caseFirst: "upper" } }
)

複数Collectionに対するViewの例

実Collectionを作成します。

db.inventory.insertMany( [
   { prodId: 100, price: 20, quantity: 125 },
   { prodId: 101, price: 10, quantity: 234 },
   { prodId: 102, price: 15, quantity: 432 },
   { prodId: 103, price: 17, quantity: 320 }
] )
db.orders.insertMany( [
   { orderId: 201, custid: 301, prodId: 100, numPurchased: 20 },
   { orderId: 202, custid: 302, prodId: 101, numPurchased: 10 },
   { orderId: 203, custid: 303, prodId: 102, numPurchased: 5 },
   { orderId: 204, custid: 303, prodId: 103, numPurchased: 15 },
   { orderId: 205, custid: 303, prodId: 103, numPurchased: 20 },
   { orderId: 206, custid: 302, prodId: 102, numPurchased: 1 },
   { orderId: 207, custid: 302, prodId: 101, numPurchased: 5 },
   { orderId: 208, custid: 301, prodId: 100, numPurchased: 10 },
   { orderId: 209, custid: 303, prodId: 103, numPurchased: 30 }
] )

orders collectionとinventory collectionを結合する操作例です。

db.createView(
  "sales",
  "orders",
    [
      {
        $lookup: {
            from: "inventory",
            localField: "prodId",
            foreignField: "prodId",
            as: "inventoryDocs"
        }
      },
      {
        $project: {
          _id: 0,
          prodId: 1,
          orderId: 1,
          numPurchased: 1,
          price: "$inventoryDocs.price"
        }
      },
      { $unwind: "$price" }
] )

Capped Collections

Capped Collectionは文字通り、Capped(上限)を定めたCollectionです。ログデータのように自動的にローテートさせたい用途で使用されます。

Capped Collectionを作成する書式は以下の通りです。Collectionのファイルサイズはsizeで指定し、格納件数の上限はmaxで指定します。maxは指定を省略する事もできます(省略した場合は件数によるCappedなし)。

db.createCollection("<collection_name>", { capped : true, size : <byte>, max : <num> } )

それでは簡単な動作確認をしてみましょう。実務ではありえないシナリオですが、Collectionの上限を10件とし、50件のデータ挿入を試みます。

db.createCollection("log", { capped : true, size : 4096, max : 10 } )

for (var i = 0; i < 50; i++){
  db.log.insertOne({_id:i, message:"test message"})
}

findでデータ取得を試みると、末尾10件のみが格納されている事が読み取れます。

sample01> db.log.find()
[
  { _id: 40, message: 'test message' },
  { _id: 41, message: 'test message' },
  { _id: 42, message: 'test message' },
  { _id: 43, message: 'test message' },
  { _id: 44, message: 'test message' },
  { _id: 45, message: 'test message' },
  { _id: 46, message: 'test message' },
  { _id: 47, message: 'test message' },
  { _id: 48, message: 'test message' },
  { _id: 49, message: 'test message' }
]
sample01> 

Capped Collectionはログデータの格納用途として使われる事が多いです。そのため、tailコマンドのように末尾のみを観察したい事もあるでしょう。

このような場合は”.sort({ $natural: -1 })”との指定をすると、挿入の逆順でdocumentの取得が可能です。また、limit()を併用する事で表示件数を制御する事もできるでしょう。以下は、末尾3件を表示させる操作例です。

sample01> db.log.find().sort({ $natural: -1 }).limit(3)
[
  { _id: 49, message: 'test message' },
  { _id: 48, message: 'test message' },
  { _id: 47, message: 'test message' }
]
sample01> 
タイトルとURLをコピーしました