Кнопочные формы Уровень А.
При выполнении этой работы используется база данных Футбол, с которой вы работали на предыдущих уроках.
Постройте формы для ввода данных на основе запросов ЗапросЛучшие и ЗапросОчки. Постройте кнопочную форму, в которой каждая кнопка служит для открытия соответствующей формы с данными:
Создайте макрос, который автоматически открывает кнопочную форму при открытии базы.
Уровень B-C.
При выполнении этой работы используется база данных Кафе, с которой вы работали на предыдущих уроках.
Создайте табличные формы Блюда и Заказы для редактирования данных. Используя материал учебника, постройте кнопочную форму, показанную на рисунке:
При щелчке по одной из кнопок должна появляться соответствующая форма.
Создайте макрос, который автоматически открывает кнопочную форму при открытии базы (он должен обязательно иметь имя AutoExec).
Отчёты Уровень А.
При выполнении этой работы используется база данных Футбол, с которой вы работали на предыдущих уроках.
Постройте отчет Результаты на основе запроса ЗапросОчки с помощью мастера. Расположите команды по убыванию количества набранных очков. Измените внешний вид отчета так, как показано на рисунке. При редактировании отчёта в OpenOffice Writer нужно добавить новый столбец Место и установить для ячейки стиль нумерованного списка.
Уровень B-С.
П ри выполнении этой работы используется база данных Кафе, с которой вы работали на предыдущих уроках.
Используя материал учебника, постройте отчёт с группировкой, показанный на рисунке.
Нереляционные базы данных В этой работе мы познакомимся с документо-ориентированной СУБД MongoDB (http://www.mongodb.org). Эта СУБД кроссплатформенная и относится к категории свободного программного обеспечения (OpenSource). Для управления данными используется язык JavaScript.
Данные хранятся не в виде таблиц, а в виде коллекций документов. Документ – это объект, имеющий свойства, то есть пары «имя-значение». Главное свойство документа – это его идентификатор (код), который всегда играет роль первичного ключа.
В одной коллекции могут быть совершенно разные документы с разным набором свойств, это и отличает документо-ориентированную БД от реляционной.
Информация об объекте записывается в фигурных скобках, например:
{ name: "Вася", age: 16 }
Этот объект имеет два свойства (поля) – свойство name со значением «Вася» и свойство age со значением 16. Такой текстовый формат записи называется JSON (англ. JavaScriptObjectNotation=запись объектов с помощью JavaScript).
Свойства объекта могут быть списками значений (массивами), они перечисляются в квадратных скобках через запятую:
{ name: "Вася", age: 16, lang: ["C", "Pascal", "JavaScript"] }
Здесь свойство lang – массив, в котором записаны названия языков программирования.
Свойства могут сами быть объектами со своими свойствами, например:
{
name: "Вася",
family: { mother: "Вера", father: "Петя" }
}
Свойство family содержит два внутренних свойства (поля): mother и father.
Начало работы Запустите программу mongo в консольном режиме. Определите рабочую базу данных, выполнив команду db (от англ. database = база данных)
db
Ответ:
Мы построим простую базу данных для блога в Интернете. Переключитесь на базу данных blog с помощью команды
use blog
Если этой базы данных раньше не было, она будет создана. Проверьте, что она действительно стала активной.
Для добавления объекта в коллекцию используется оператор insert (вставить):
db.posts.insert ( документ )
Первая часть записи, «db», означает обращение к рабочей базе данных; вторая, «posts» - название коллекции (если такой коллекции нет, она будет создана), в скобках записываются свойства объекта-документа. В нашем примере в базе blog будет одна коллекция posts (сообщения, записи, «посты»). Для каждого поста нужно задать дату и текст. Добавьте одну запись следующим образом6:
db.posts.insert (
{date: new Date("04/23/2020"), text: "Привет!"} )
Дата (свойство date) строится с помощью функции Date; ей передается символьная запись даты в формате, принятом в США (месяц/день/год).
Проверьте, создана ли коллекция posts с помощью команды, которая показывает все коллекции текущей базы:
show collections
Проверьте, добавлена ли запись, с помощью команды
db.posts.find()
которая ищет и показывает все документы, входящие в коллекцию posts. Для вывода в красивом формате можно дополнительно вызвать функцию pretty (англ. приятный)
db.posts.find().pretty()
В этом случае, если список свойств документа не помещается в одну строку, он выводится в столбик:
{
"_id": ObjectId("5176abbc06a6380da34966a2"),
"date": ISODate("2020-04-22T20:00:00Z"),
"text": "Привет!"
}
СУБД автоматически добавила поле «_id» (идентификатор, код), которое представляет собой суррогатный первичный ключ и строится случайным образом с помощью функции ObjectId.
Дата преобразована в формат Международной организации по стандартизации (ISO) и, кроме собственно даты, включает еще и время. Мы задали дату 23.04.2020, время не задавали, поэтому принимается время 00:00. По Гринвичу в этот момент было 20:00, а дата – 22.04.2020.
Если нужно, значение ключа «_id» можно задать самостоятельно, какое мы хотим. Удалим все документы из коллекции командой remove:
db.posts.remove()
и добавим четыре новых поста в базу, указав явно идентификаторы7:
db.posts.insert ( {_id: 1, date: new Date("04/23/2020"), text: "Привет!" } )
db.posts.insert ( {_id: 2, date: new Date("04/24/2020"), text: "Это второй пост." } )
db.posts.insert ( {_id: 3, date: new Date("04/25/2020"), text: "Это третий пост." } )
db.posts.insert ( {_id: 4, date: new Date("04/26/2020"), text: "Это четвёртый пост." } )
Убедитесь, что документы действительно добавлены в коллекцию.
Поиск Для поиска нужных документов используется уже знакомая нам функция find. В скобках можно задать критерий поиска – это объект (записанный в фигурных скобках), который содержит название поля и значение этого поля, которое мы ищем. Например, найдите документ с кодом (идентификатором, _id), равным 2:
db.posts.find( {_id: 2} )
В условиях можно использовать не только строгие равенства, как в предыдущее примере, но неравенства. Неравенство – это тоже объект, у которого специальное название свойства, начинающееся знаком $:
$ne – не равно,
$lt – меньше, $lte – меньше или равно,
$gt – больше, $gte – больше или равно
Например, найдем записи с идентификатором больше 2:
db.posts.find( {_id: {$gt: 2} } )
Сколько документов найдено?
Ответ:
Найдем посты, написанные 24.04.2020 или позднее:
db.posts.find({date: {$gte: new Date("04/24/2020")} })
Для поиска можно использовать сразу несколько условий. Если все условия нужно выполнить одновременно, их записывают как один объект с несколькими свойствами. Например, следующий запрос находит все документы, у которых свойство «_id» больше 2, а дата создания – не раньше 26.04.2020:
db.posts.find( { _id: {$gt: 2},
date: {$gtе: new Date("04/26/2020")} } )
Самое мощное средство поиска в MongoDB – это оператор $where, которому можно передать строку в кавычках, задающую условие поиска на JavaScript, например,
db.posts.find( { $where: "this._id > 2" } )
Здесь this – это объект (документ), который требуется проверить; через точку записывается название нужного поля. Оператору $where можно передать любую функцию на JavaScript, которая возвращает логическое значение (истинное, если условие отбора выполняется). Например, запрос, показанный в п. 10, можно было записать так:
db.posts.find( { $where: function()
{ return this._id > 2 &&
this.date >= new Date("04/26/2020")
}
} )
Пара символов && в языке JavaScript обозначает логическую операцию «И», а символы || – логическую операцию «ИЛИ». Проверка на равенство записывается как «==», а условие «не равно» – как «!=».
Составьте запрос для поиска всех документов, у которых свойство _id равно 1 или дата создания равна 26.04.2020.
Учтите, что в MongoDB дата хранится вместе со временем, то есть new Date() создает объект время+дата, соответствующий моменту 00:00 заданного дня (по местному времени). Поэтому отобрать документы с конкретной датой можно с помощью двойного неравенства (прямое сравнение не сработает).
Ответ:
Сортировка Для сортировки используется функция sort. Она сортирует те документы, которые предварительно найдены с помощью find. При вызове функции sort в скобках указывается порядок сортировки – объект (в фигурных скобках), содержащий название поля для сортировки; значение этого поля может быть 1 (сортировка по возрастанию) или «-1» (по убыванию).
Отсортируйте документы по возрастанию даты
db.posts.find().sort( {date: 1} )
а теперь по убыванию:
db.posts.find().sort( {date: -1} )
Изменение Для изменения документов используют команду update. Допустим, мы хотим добавить к документу с идентификатором 1 новое логическое свойство visible (англ. видимый) и присвоить ему значение false (ложь), которое означает, что это пост пока скрыт и выводить его на веб-страницу не нужно.
Функции update передаются два объекта в фигурных скобках: условие, позволяющее найти нужный документ, и свойства, которые у него нужно изменить. Попробуйте выполнить команду
db.posts.update( {_id: 1}, {visible: false} )
и посмотрите, что получилось в результате.
Ответ:
Восстановите исходный пост с кодом 1. Какую команду нужно ввести?
Ответ:
Для того, чтобы не заменять документ полностью, а изменить (или добавить) значение какого-то поля, нужно использовать специальный объект со свойством $set (установить):
db.posts.update( {_id: 1}, {$set: {visible: false}} )
Примените эту команду и проверьте результат её выполнения.
Обратите внимание, что сейчас в коллекции posts находятся документы с разной структурой: один из них имеет свойство visible, а остальные – нет. При этом никаких изменений в структуру базы данных вносить не пришлось.
Найдите все документы, у которых свойство visible равно false. Какой запрос нужно для этого выполнить?
Ответ:
Теперь выполним множественное обновление: установим свойство visible равным true (истина) для всех документов, для которых это свойство не установлено (или, что то же самое, равно специальному нулевому значению null):
db.posts.update( {visible: null},
{$set: {visible: true}}, {multi: true} )
Третий параметр – объект со свойством multi (англ. множественный), равным true (истина) разрешает изменение нескольких документов сразу (если его не указать, будет изменён только один документ – тот, который найден первым).
Составьте запрос для поиска всех документов, у которых свойство visible равно true, а дата создания – не позднее 25.04.2020:
Ответ:
Проверьте результат его работы.
Теперь добавим к комментарии к одному из постов (с идентификатором 2). Заметьте, что благодаря документо-ориентированной СУБД заранее планировать наличие комментариев не нужно – мы можем добавлять новые свойства к любому документу «на ходу».
Комментариев может быть много, поэтому новое свойство comments будет массивом. Для добавления нового элемента в массив используется специальный объект со свойство $push (англ. втолкнуть):
db.posts.update( {_id: 2},
{$push: {comments: "Комментарий 1"} })
db.posts.update( {_id: 2},
{$push: {comments: "Комментарий 2"} })
db.posts.update( {_id: 2},
{$push: {comments: "Комментарий 3"} })
Когда выполняется первая из этих команд, у документа с идентификатором 2 еще нет свойства comments – оно будет создано автоматически.
Все документы с комментариями можно найти с помощью объекта со свойством $exists (существует):
var c = db.posts.find( {comments: {$exists: true}} )
Результат этого запроса не выводится на экран, а записывается в переменную c. Затем можно определить его длину (число найденных документов) с помощью функции length (англ. длина) и вывести на экран в цикле в формате JSON с помощью функции printjson:
for(i = 0; i < c.length(); i++) printjson( c[i] )
Можно работать и с отдельными свойствами, например, вывести на экран даты всех найденных постов с помощью функции print:
for(i = 0; i < c.length(); i++) print( c[i].date )
Удаление Как вы уже знаете, для удаления всех документов из коллекции используется команда remove. Запишите команду, которая удаляет все документы из коллекции posts, но не выполняйте её.
Ответ:
С помощью команды remove можно удалять отдельные записи – условие для поиска нужных записей задается как параметр функции. Например:
db.posts.remove( {_id: 4} )
Выполните эту команду и проверьте её выполнение.
Запишите команду для удаления всех документов, у которых свойство visible установлено в false выполните её.
Ответ:
С помощью команды drop вся коллекция удаляется из базы. Например,
db.posts.drop()
Объясните, в чём отличие между командами remove() и drop().
Ответ:
Проверьте, что коллекция posts действительно была удалена. Какую команду нужно для этого использовать?
Ответ:
Дополнительная информация: http://www.mongodb.org – официальный сайт разработки MongoDB. http://docs.mongodb.org/manual/installation/ – инструкция по установке MongoDB для разных операционных систем. http://jsman.ru/mongo-book/ – русский перевод книги K. Seguin «The Little MongoDB Book».
|