はじめに
この実験では、MongoDB の様々な基本的なデータ型を扱う方法を学びます。この実験では、数値、文字列、ブール値、日付、ObjectId を使用してデータを保存、クエリ、操作する方法の実践的な例を扱います。一般的なデータベース操作を実行し、各データ型の適切なユースケースを理解するための実践的な経験を積むことができます。この実験の終わりには、MongoDB で効果的にデータをモデリングするための確固たる基盤を築くことができるでしょう。
数値と文字列の操作
この最初のステップでは、最も一般的なデータ型である数値と文字列の使用方法を学びます。MongoDB シェルを起動し、データベースとコレクションを作成してから、これらの型を含むドキュメントを挿入およびクエリします。
まず、ターミナルを開き、MongoDB シェルを起動します。この対話型環境では、データベースに対して直接コマンドを実行できます。
mongosh
シェルに入ると、> プロンプトが表示されます。inventory という名前の新しいデータベースを作成して切り替えましょう。MongoDB では、最初にデータを保存したときにデータベースが自動的に作成されます。
use inventory
次に、products という名前のコレクションを作成し、ドキュメントを挿入します。このドキュメントには、文字列フィールド (name) と 2 つの数値フィールド (price と stock) が含まれます。MongoDB は BSON (Binary JSON) 型を使用しており、数値は整数または浮動小数点数 (倍精度) のいずれかになります。
db.products.insertOne({
name: "Laptop",
price: 1200.50,
stock: 50
})
新しく挿入されたドキュメントの ObjectId を含む確認メッセージが表示されるはずです。
出力例:
{
"acknowledged": true,
"insertedId": ObjectId("...")
}
ドキュメントが挿入されたので、コレクションをクエリしましょう。まず、$gt (greater than) 演算子を使用して、価格が 1000 より大きい製品を検索します。
db.products.find({ price: { $gt: 1000 } })
出力例:
[
{
_id: ObjectId("..."),
name: 'Laptop',
price: 1200.5,
stock: 50
}
]
次に、文字列値である製品を正確な名前で検索するクエリを実行します。これは、特定のアイテムを取得するための一般的な方法です。
db.products.find({ name: "Laptop" })
このコマンドは同じドキュメントを返します。これにより、文字列フィールドに基づいてクエリする方法が示されます。
ブール値と Null 値の使用
このステップでは、ブール値と Null データ型について説明します。ブール値は、フラグのように、真偽の状態を表すフィールドに最適です。Null 型は、値を持たないフィールドを表すために使用されます。
mongosh シェルで inventory データベースの使用を続けます。ブール値フィールド inStock および onSale、そして null に設定された discontinuedDate フィールドを持つ新しい製品を挿入します。
db.products.insertOne({
name: "Wireless Mouse",
price: 25,
inStock: true,
onSale: false,
discontinuedDate: null
})
出力例:
{
"acknowledged": true,
"insertedId": ObjectId("...")
}
これで、ブール値と Null 値を持つドキュメントができました。他のデータ型と同様に、これらの値をクエリできます。ブール値 true をクエリして、現在在庫のあるすべての製品を見つけましょう。
db.products.find({ inStock: true })
出力例:
[
{
_id: ObjectId("..."),
name: 'Wireless Mouse',
price: 25,
inStock: true,
onSale: false,
discontinuedDate: null
}
]
このコマンドは、inStock フィールドが正確に true であるドキュメントを取得します。次に、discontinuedDate フィールドで null 値を検索して、廃止されていない製品を見つけましょう。MongoDB では、null をクエリすると、フィールドが明示的に null に設定されているドキュメントと、フィールドが存在しないドキュメントの両方に一致することに注意してください。
db.products.find({ discontinuedDate: null })
このクエリは複数のドキュメントを返します。「Wireless Mouse」(discontinuedDate: null を持つ)と、discontinuedDate フィールドがまったく存在しない他の製品(「Laptop」など)です。フィールドが明示的に null に設定されているドキュメントのみを見つけたい場合は、異なるクエリパターンを使用する必要があります。
日付とタイムスタンプの保存
このステップでは、作成日、更新日、イベントなどの時間ベースの情報を保存するために不可欠な Date データ型に焦点を当てます。MongoDB は、日付を Unix エポック (1970 年 1 月 1 日 UTC) からのミリ秒を表す 64 ビット整数として保存します。
日付フィールドを持つドキュメントを挿入しましょう。現在の時刻の日付オブジェクトは new Date() を使用して作成できます。特定の日付オブジェクトは、ISO-8601 日付文字列を渡すことで作成できます。
db.products.insertOne({
name: "Smartwatch",
price: 250,
purchaseDate: new Date("2023-10-26T10:00:00Z"),
lastUpdated: new Date()
})
出力例:
{
"acknowledged": true,
"insertedId": ObjectId("...")
}
次に、日付フィールドに基づいて製品をクエリしましょう。たとえば、2023 年の初日以降に購入されたすべての製品を見つけます。$gte (greater than or equal to) 演算子と Date オブジェクトを使用できます。
db.products.find({
purchaseDate: { $gte: new Date("2023-01-01") }
})
出力例:
[
{
_id: ObjectId("..."),
name: 'Smartwatch',
price: 250,
purchaseDate: ISODate('2023-10-26T10:00:00.000Z'),
lastUpdated: ISODate('...')
}
]
MongoDB は日付の更新演算子も提供します。$currentDate 演算子は、フィールドを現在のサーバー日付に設定するのに役立ちます。以前に作成した「Laptop」ドキュメントの lastUpdated フィールドを更新して、最後に変更された時刻を追跡しましょう。
db.products.updateOne(
{ name: "Laptop" },
{ $currentDate: { lastUpdated: true } }
)
出力例:
{
"acknowledged": true,
"insertedId": null,
"matchedCount": 1,
"modifiedCount": 1,
"upsertedCount": 0
}
この操作は、「Laptop」という名前のドキュメントを見つけ、その lastUpdated フィールドを現在のタイムスタンプに更新します。
ObjectId と配列の理解
この最終ステップでは、ObjectId と Array という 2 つの重要な構造型について学びます。MongoDB のすべてのドキュメントには一意の _id フィールドがあり、指定しない場合はデフォルトで ObjectId になります。配列を使用すると、単一のフィールド内に値のリストを保存できます。
まず、tags という名前の配列フィールドを持つドキュメントを挿入しましょう。これは、複数のカテゴリや属性を保存するのに役立ちます。
db.products.insertOne({
name: "Mechanical Keyboard",
price: 75,
tags: ["gaming", "mechanical", "RGB"]
})
出力例:
{
"acknowledged": true,
"insertedId": ObjectId("...")
}
insertedId は、この新しいドキュメントの ObjectId です。これは一意性を保証する 12 バイトの値です。_id でドキュメントをクエリできます。まず、ドキュメントを見つけて、その _id を変数に格納します。
const keyboard = db.products.findOne({ name: "Mechanical Keyboard" })
const keyboardId = keyboard._id
次に、この keyboardId 変数を使用してドキュメントを再度取得します。これは、単一の特定のドキュメントを取得する最も効率的な方法です。
db.products.findOne({ _id: keyboardId })
次に、tags 配列を操作しましょう。配列に特定の要素が含まれているドキュメントをクエリできます。たとえば、「gaming」というタグが付いたすべての製品を見つけるには、次のようにします。
db.products.find({ tags: "gaming" })
出力例:
[
{
_id: ObjectId("..."),
name: 'Mechanical Keyboard',
price: 75,
tags: [ 'gaming', 'mechanical', 'RGB' ]
}
]
このコマンドは、tags 配列に文字列「gaming」が含まれているすべてのドキュメントを効率的に見つけます。配列は、単一のドキュメント内でリレーションシップをモデル化するための強力な機能です。MongoDB シェルを終了するには、「exit」と入力するか、Ctrl+D を押します。
exit
まとめ
この実験では、MongoDB の最も基本的なデータ型を扱う方法を学びました。まず、数値と文字列を使用して製品情報を保存およびクエリしました。次に、ステータスフラグや欠落データを表現するためにブール値と null 値を調べました。また、Date 型とその関連演算子を使用して時間データを処理する方法も学びました。最後に、一意の識別子としての ObjectId と、値のリストを保存するための Array 型について理解を深めました。この知識は、幅広いアプリケーションで MongoDB データベースを設計および操作するための強力な基盤を提供します。

