Установив бд, теперь мы можем добавить в нее данные. Все данные хранятся в бд в формате BSON, который близок к JSON, поэтому нам надо также вводить данные в этом формате. И хотя у нас, возможно, на данный момент нет ни одной коллекции, но при добавлении в нее данных она автоматически создается.
Как ранее говорилось, имя коллекции - произвольный идентификатор, состоящий из не более чем 128 различных алфавитно-цифровых символов и знака подчеркивания.
В то же время имя коллекции не должно начинаться с префикса system., так как он зарезервирован для внутренних коллекций (например,
коллекция system.users содержит всех пользователей базы данных). И также имя не должно содержать знака доллара - $.
Для добавления в коллекцию могут использоваться три ее метода:
insertOne(): добавляет один документ
insertMany(): добавляет несколько документов
insert(): может добавлять как один, так и несколько документов
Итак, добавим один документ:
db.users.insertOne({"name": "Tom", "age": 28, languages: ["english", "spanish"]})
Документ представляет набор пар ключ-значение. В данном случае добавляемый документ имеет три ключа: name, age, languages, и каждому из них сопоставляет определенное значение. Например, ключу languages в качесте значения сопоставляется массив.
Некоторые ограничения при использовании имен ключей:
Символ $ не может быть первым символом в имени ключа
Имя ключа не может содержать символ точки .
Имя _id не рекомендуется использовать
Стоит отметить, что названия ключей могут использоваться в кавычках, а могут и без кавычек.
В случае удачного добавления на консоль будет выведен идентификатор добавленного документа.
И чтобы убедиться, что документ в бд, мы его выводим функцией find.
Если надо добавить ряд документов, то мы можем воспользоваться методом insertMany():
db.users.insertMany([{"name": "Bob", "age": 26, languages: ["english", "frensh"]},
{"name": "Alice", "age": 31, languages:["german", "english"]}])
После добавления консоль выводит идентификаторы добавленных документов:
И третий метод - insert() демонстрирует более универсальный способ добавления документов. При его вызове в него также передается добавляемый документ:
db.users.insert({"name": "Tom", "age": 28, languages: ["english", "spanish"]})
После его вызова на консоль выводится количество добавленных записей:
WriteResult({ "nInserted" : 1 })
Возможно, не всем будет удобно вводить в одну строчку все пары ключей и свойств. Но интеллектуальный интерпретатор MongoDB на основе javascript позволяет также вводить и многострочные команды. Если выражение не закончено (с точки зрения языка JavaScript), и вы нажимаете Enter, то ввод следующей части выражения автоматически переносится на следующую строку:
В процессе работы, возможно, потребуется изменить название коллекции. Например, если при первом добавлении данных в ее названии была опечатка. И чтобы не удалять и затем пересоздавать коллекцию, следует использовать функцию renameCollection:
db.users.renameCollection("новое_название")
И если переименование пройдет удачно, то консоль отобразит:
{"ok" : 1}
В предыдущем примере коллекция создавалась неявно автоматически при добавлении в нее первых данных. Но мы также можем создать ее явным образом,
применив метод db.createCollection(name, options), где name - название коллекции, а options -
необязательный объект с дополнительными настройками инициализации. Например:
db.createCollection("accounts")
{"ok" : 1}
Таким образом, создается коллекция accounts.
Когда мы отправляем запрос к бд на выборку, то MongoDB возвращает нам документы в том порядке, как правило, в котором они были добавлены. Однако такой порядок не всегда гарантируется, так как данные могут быть удалены, перемещены, изменены. Поэтому в MongoDB существует понятие ограниченной коллекции (capped collection). Подобная коллекция гарантирует, что документы будут располагаться в том же порядке, в котором они добавлялись в коллекцию. Ограниченные коллекции имеют фиксированный размер. И когда в коллекции уже нет места, наиболее старые документы удаляются, и в конец добавляются новые данные.
В отличие от обычных коллекций ограниченные мы можем задать явным образом. Например, создадим ограниченную коллекцию с названием
profile и зададим для нее размер в 9500 байт:
db.createCollection("accounts")
{"ok" : 1}
И после удачного создания коллекции консоль выведет:
{"ok":1}
Также можно ограничить количество документов в коллекции, указав его в параметре max:
db.createCollection("profile", {capped:true, size:9500, max: 150})
Однако при таком способе создания коллекции следует учитывать, что если все место под коллекцию заполнено (например, выделенные нами 9500 байтов), а количество документов еще не достигло максимума, в данном случае 150, то в этом случае при добавлении нового документа самый старый документ будет удаляться, а на его место будет вставляться новый документ.
При обновлении документов в таких коллекциях надо помнить, что документы не должны расти в размерах, иначе обновление не удастся произвести.
Также нельзя удалять документы из подобных коллекций, можно только удалить всю коллекцию.
Для упрощения организации данных в коллекциях мы можем использовать подколлекции. Например, данные по коллекции users надо разграничить на профили и учетные данные. И мы можем использовать создать коллекции db.users.profiles и db.users.accounts.
При этом они не будут никак связаны с коллекцией users. То есть в итоге будут три разные коллекции, однако в плане логической организации хранения данных, возможно, для кого-то так будет проще.