Управление вложенными документами MongoDB

MongoDBMongoDBBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабе вы научитесь эффективно управлять вложенными документами MongoDB. В лабе рассматриваются различные методы, включая создание вложенных документов, обновление вложенных полей, удаление вложенных элементов, запросы к вложенным данным и проверка структуры документа. Эти навыки необходимы для работы с сложными иерархическими данными в MongoDB и позволяют создавать надежные и эффективные приложения. Пошаговые инструкции дают полный обзор по освоению управления вложенными документами в ваших проектах MongoDB.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL mongodb(("MongoDB")) -.-> mongodb/QueryOperationsGroup(["Query Operations"]) mongodb(("MongoDB")) -.-> mongodb/BasicOperationsGroup(["Basic Operations"]) mongodb(("MongoDB")) -.-> mongodb/DataTypesGroup(["Data Types"]) mongodb(("MongoDB")) -.-> mongodb/ArrayandEmbeddedDocumentsGroup(["Array and Embedded Documents"]) mongodb/BasicOperationsGroup -.-> mongodb/create_database_collection("Create Database and Collection") mongodb/BasicOperationsGroup -.-> mongodb/insert_document("Insert Document") mongodb/BasicOperationsGroup -.-> mongodb/update_document("Update Document") mongodb/QueryOperationsGroup -.-> mongodb/query_with_conditions("Query with Conditions") mongodb/DataTypesGroup -.-> mongodb/use_string_data_types("Use String Data Types") mongodb/DataTypesGroup -.-> mongodb/work_with_array_data_types("Work with Array Data Types") mongodb/DataTypesGroup -.-> mongodb/manage_array_elements("Manage Array Elements") mongodb/ArrayandEmbeddedDocumentsGroup -.-> mongodb/create_embedded_documents("Create Embedded Documents") mongodb/ArrayandEmbeddedDocumentsGroup -.-> mongodb/query_embedded_documents("Query Embedded Documents") subgraph Lab Skills mongodb/create_database_collection -.-> lab-422088{{"Управление вложенными документами MongoDB"}} mongodb/insert_document -.-> lab-422088{{"Управление вложенными документами MongoDB"}} mongodb/update_document -.-> lab-422088{{"Управление вложенными документами MongoDB"}} mongodb/query_with_conditions -.-> lab-422088{{"Управление вложенными документами MongoDB"}} mongodb/use_string_data_types -.-> lab-422088{{"Управление вложенными документами MongoDB"}} mongodb/work_with_array_data_types -.-> lab-422088{{"Управление вложенными документами MongoDB"}} mongodb/manage_array_elements -.-> lab-422088{{"Управление вложенными документами MongoDB"}} mongodb/create_embedded_documents -.-> lab-422088{{"Управление вложенными документами MongoDB"}} mongodb/query_embedded_documents -.-> lab-422088{{"Управление вложенными документами MongoDB"}} end

Создание вложенных документов

В этом шаге вы научитесь создавать вложенные документы в MongoDB, что позволяет хранить сложные иерархические данные в одном документе. Вложенные документы мощны для представления отношений и структурированной информации.

Сначала запустим MongoDB shell:

mongosh

Теперь создадим базу данных для нашего примера:

use bookstore

Создадим коллекцию под названием books с вложенными документами, представляющими детали книги:

db.books.insertOne({
    title: "Advanced MongoDB",
    author: {
        name: "Jane Smith",
        contact: {
            email: "jane.smith@example.com",
            phone: "+1-555-123-4567"
        }
    },
    published: {
        year: 2023,
        publisher: "Tech Publications"
    },
    chapters: [
        { number: 1, title: "Introduction to Nested Documents" },
        { number: 2, title: "Advanced Document Structures" }
    ]
})

Разберём этот документ:

  • В документе есть главный поле title
  • author — это вложенный документ с поддокументами name и contact
  • published — другой вложенный документ с деталями публикации
  • chapters — это массив вложенных документов, представляющих главы книги

Для просмотра документа, который мы только что создали, используйте:

db.books.find()

Пример вывода:

[
  {
    _id: ObjectId("..."),
    title: 'Advanced MongoDB',
    author: {
      name: 'Jane Smith',
      contact: {
        email: 'jane.smith@example.com',
        phone: '+1-555-123-4567'
      }
    },
    published: {
      year: 2023,
      publisher: 'Tech Publications'
    },
    chapters: [
      { number: 1, title: 'Introduction to Nested Documents' },
      { number: 2, title: 'Advanced Document Structures' }
    ]
  }
]

Обновление вложенных полей

В этом шаге вы научитесь обновлять вложенные поля в документах MongoDB. Основываясь на предыдущем шаге, мы будем использовать документ книги, который мы создали, чтобы показать различные методы обновления для вложенных документов.

Сначала убедитесь, что вы находитесь в MongoDB shell:

mongosh

Переключитесь на базу данных bookstore:

use bookstore

Обновим контактную информацию автора с использованием оператора $set:

db.books.updateOne(
    { title: "Advanced MongoDB" },
    { $set: {
        "author.contact.phone": "+1-888-999-0000",
        "author.contact.website": "www.janesmith.com"
    } }
)

Точка в записи "author.contact.phone" позволяет точно указать вложенные поля. Проверим обновление:

db.books.find({ title: "Advanced MongoDB" })

Теперь обновим вложенный массив. Добавим новую главу в массив chapters:

db.books.updateOne(
    { title: "Advanced MongoDB" },
    { $push: {
        chapters: {
            number: 3,
            title: "MongoDB Advanced Techniques"
        }
    } }
)

Оператор $push добавляет новый элемент в массив. Проверим обновление:

db.books.find({ title: "Advanced MongoDB" })

Мы также можем обновить конкретный элемент вложенного массива с использованием позиционного оператора $. Обновим первую главу:

db.books.updateOne(
    { title: "Advanced MongoDB", "chapters.number": 1 },
    { $set: {
        "chapters.$.title": "Introduction to Nested Documents (Revised)"
    } }
)

Пример вывода покажет обновлённый документ с изменёнными вложенными полями и добавленной главой.

Удаление вложенных элементов

В этом шаге вы научитесь удалять вложенные элементы из документов MongoDB с использованием различных операторов. Продолжим работать с документом книги из предыдущих шагов.

Сначала убедитесь, что вы находитесь в MongoDB shell:

mongosh

Переключитесь на базу данных bookstore:

use bookstore

Удалим конкретное поле из вложенной контактной информации с использованием оператора $unset:

db.books.updateOne(
    { title: "Advanced MongoDB" },
    { $unset: { "author.contact.website": "" } }
)

Оператор $unset полностью удаляет указанное поле. Проверим обновление:

db.books.find({ title: "Advanced MongoDB" })

Теперь удалим конкретный элемент из массива chapters с использованием оператора $pull:

db.books.updateOne(
    { title: "Advanced MongoDB" },
    { $pull: {
        chapters: { number: 3 }
    } }
)

Оператор $pull удаляет все вхождения совпадающего элемента из массива. Проверим:

db.books.find({ title: "Advanced MongoDB" })

Мы также можем удалить целый вложенный контактный объект:

db.books.updateOne(
    { title: "Advanced MongoDB" },
    { $unset: { "author.contact": "" } }
)

Пример вывода покажет документ с удаленными вложенными элементами.

Запрос к вложенным данным

В этом шаге вы научитесь запрашивать вложенные документы и массивы в MongoDB. Мы рассмотрим различные методы фильтрации и извлечения конкретных вложенных данных.

Сначала сбросим нашу базу данных с некоторыми примерами данных для демонстрации запросов:

mongosh

Переключимся на базу данных bookstore:

use bookstore

Вставим несколько книг со вложенными структурами:

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 }
        ]
    }
])

Запросить книгу по вложенному полю:

db.books.find({ "author.name": "John Doe" })

Запрос с использованием точной нотации для вложенных объектов:

db.books.find({ "author.experience.specialization": "Database Design" })

Запрос с использованием массива содержит:

db.books.find({ tags: "nosql" })

Запросить вложенные элементы массива:

db.books.find({ "chapters.pages": { $gt: 40 } })

Оператор $gt означает "больше", поэтому этот запрос находит книги с главами длинее 40 страниц.

Сложный запрос, комбинирующий условия вложенного объекта и массива:

db.books.find({
    "author.experience.years": { $gte: 5 },
    tags: "advanced"
})

Этот запрос находит книги авторов с 5 и более годами опыта и помеченными как "advanced".

Проверка структуры документа

В этом шаге вы научитесь проверять структуры документов в MongoDB с использованием проверки JSON Schema. Это гарантирует, что ваши документы сохраняют一致ную и предсказуемую структуру.

Сначала запустим MongoDB shell:

mongosh

Переключимся на базу данных bookstore:

use bookstore

Создадим новую коллекцию с валидатором JSON Schema:

db.createCollection("courses", {
   validator: {
      $jsonSchema: {
         bsonType: "object",
         required: ["title", "instructor", "duration", "topics"],
         properties: {
            title: {
               bsonType: "string",
               description: "должно быть строкой и является обязательным"
            },
            instructor: {
               bsonType: "object",
               required: ["name", "email"],
               properties: {
                  name: {
                     bsonType: "string",
                     description: "должно быть строкой и является обязательным"
                  },
                  email: {
                     bsonType: "string",
                     pattern: "^.+@.+$",
                     description: "должно быть действительным адресом электронной почты"
                  }
               }
            },
            duration: {
               bsonType: "int",
               minimum: 1,
               maximum: 100,
               description: "должно быть целым числом от 1 до 100"
            },
            topics: {
               bsonType: "array",
               minItems: 1,
               items: {
                  bsonType: "string"
               },
               description: "должно быть массивом строк с хотя бы одним элементом"
            }
         }
      }
   }
})

Попробуем вставить допустимый документ:

db.courses.insertOne({
   title: "MongoDB Advanced Techniques",
   instructor: {
      name: "Jane Smith",
      email: "jane.smith@example.com"
   },
   duration: 40,
   topics: ["Nested Documents", "Schema Validation"]
})

Теперь попробуем недействительный документ, который будет отклонен:

db.courses.insertOne({
   title: "Invalid Course",
   instructor: {
      name: 123,  // Недействительно: должно быть строкой
      email: "invalid-email"  // Недействительный формат электронной почты
   },
   duration: 200,  // Превышает диапазон
   topics: []  // Пустой массив тем
})

Вставка неудастся из-за правил проверки.

Для просмотра правил проверки для коллекции:

db.getCollectionInfos({ name: "courses" })

Пример вывода покажет конфигурацию проверки JSON Schema.

Резюме

В этом практическом занятии вы научитесь управлять вложенными документами в MongoDB. Во - первых, вы создадите вложенные документы, что позволит хранить сложные иерархические данные в одном документе. Это мощный инструмент для представления отношений и структурированной информации. Далее вы обновите вложенные поля, удалите вложенные элементы, запросите вложенные данные и проверите структуру документа. Эти методы демонстрируют гибкость и мощь документ - ориентированной модели данных MongoDB для работы с сложными вложенными структурами данных.