ネストされたデータを持つドキュメントのクエリ
クエリは基本的なデータベース操作です。このステップでは、ネストされたオブジェクトや配列内の値に基づいてドキュメントをクエリする方法を学びます。これらの例のためにクリーンなデータセットを確保するために、まず既存の books コレクションを削除します。
db.books.drop()
次に、クエリの練習のために、異なるネスト構造を持つ新しいドキュメントをいくつか挿入します。
db.books.insertMany([
{
title: "MongoDB Essentials",
author: {
name: "John Doe",
experience: { years: 5, specialization: "Database Design" }
},
tags: ["beginner", "database", "nosql"],
chapters: [
{ number: 1, title: "Introduction", pages: 25 },
{ number: 2, title: "Advanced Concepts", pages: 45 }
]
},
{
title: "Advanced Database Techniques",
author: {
name: "Jane Smith",
experience: { years: 8, specialization: "Distributed Systems" }
},
tags: ["advanced", "distributed", "nosql"],
chapters: [
{ number: 1, title: "System Design", pages: 35 },
{ number: 2, title: "Performance Optimization", pages: 55 }
]
}
])
ネストされたドキュメントのフィールドで書籍を検索するには、ドット表記を使用します。このクエリは "John Doe" によって書かれた書籍を見つけます。
db.books.find({ "author.name": "John Doe" })
ネストされた構造のさらに奥深くに進むことができます。このクエリは、著者の専門分野が "Database Design" である書籍を見つけます。
db.books.find({ "author.experience.specialization": "Database Design" })
配列に特定の値が含まれているドキュメントを見つけるには、配列フィールドを直接クエリできます。これは "nosql" タグが付いたすべての書籍を見つけます。
db.books.find({ tags: "nosql" })
配列要素が特定の条件を満たしているドキュメントをクエリすることもできます。このクエリは、$gt(より大きい)演算子を使用して、40 ページを超える章を少なくとも 1 つ持つ書籍を見つけます。
db.books.find({ "chapters.pages": { $gt: 40 } })
最後に、複数の条件を組み合わせることができます。このクエリは、"advanced" タグが付いており、5 年以上の経験を持つ著者によって書かれた書籍を見つけます($gte は以上を意味します)。
db.books.find({
"author.experience.years": { $gte: 5 },
tags: "advanced"
})