Примечания по обучению MongoDB (1) – Введение в MongoDB и типы данных
Версия MongoDB, используемая в этой статье, – 4.0.10
> db.version(); 4.0.10
Введение в MongoDB
1. Характеристики MongoDB
MongoDB-это масштабируемая и высокопроизводительная база данных NOSQL, написанная на языке C++. Она направлена на обеспечение высокопроизводительного масштабируемого решения для хранения данных для веб-приложений. Он характеризуется высокой производительностью, простотой развертывания, простотой использования и удобным хранением данных.
- Свободный режим, поддержка динамического запроса, полный индекс, позволяет легко запрашивать встроенные объекты и массивы в документах.
- Хранилище, ориентированное на сбор, позволяет легко хранить данные объектного типа, включая встроенные в документ объекты и массивы.
- Эффективное хранение данных, поддержка двоичных данных и больших объектов (таких как фотографии и видео).
- Поддерживает репликацию и восстановление после сбоев; обеспечивает репликацию данных между режимами master-slave и master-master, а также репликацию данных между серверами.
- Автоматическая фрагментация поддерживает масштабируемость на уровне облака, поддерживает горизонтальные кластеры баз данных и динамически добавляет дополнительные серверы.
2. Преимущества и применимые сценарии MongoDB
Преимущества MongoDB
- Высокая производительность, очень быстрая (если у вас достаточно памяти).
- Фиксированной структуры таблиц не существует, и для изменения структуры таблиц не требуется перенос данных.
- Язык запросов прост и удобен в использовании.
- Используйте общий доступ для достижения горизонтального масштабирования.
- Его легко развернуть.
Применимые сценарии mongodb
- Постоянный слой кэша, подходящий для использования в качестве информационной инфраструктуры.
- Он подходит для вставки, обновления и запроса в режиме реального времени, а также обладает репликацией и высокой масштабируемостью, необходимыми для хранения данных приложений в режиме реального времени.
- Формат данных Mongo BSON очень подходит для хранения и запроса формата документа.
- Подходит для базы данных, состоящей из десятков или сотен серверов. Потому что Mongo уже включает встроенную поддержку движка MapReduce.
Сравнение SQL и NoSQL
тип | Все типы поддерживают стандарт SQL | Существует множество типов, таких как хранилище документов, хранилище значений ключей, база данных столбцов и т.д. |
Пример | MySQL,SQL Server,Oracle | MongoDB,HBase,Кассандра |
Модель Хранения Данных | Данные хранятся в строках и столбцах таблицы, каждая из которых имеет определенный тип. Таблицы обычно создаются в соответствии с принципами стандартизации. Используйте объединения для извлечения данных из нескольких таблиц. | Модель данных зависит от типа базы данных. Например, данные хранятся в виде пар ключ-значение для хранения ключ-значение. В базе данных на основе документов данные хранятся в виде документов. Модель данных Nosql является гибкой, в отличие от жесткой табличной модели базы данных SQL. |
Шаблон | Фиксированная структура и схема, поэтому любое изменение схемы включает в себя изменение базы данных | Динамические схемы могут адаптироваться к новым типам или структурам данных путем расширения или изменения текущей схемы. Новые поля могут быть добавлены динамически |
Расширяемость | Используется вертикальное расширение. Это означает, что по мере увеличения нагрузки вам необходимо покупать более крупные и дорогие серверы для размещения данных. | Используется горизонтальное расширение. Это означает, что загрузка данных может быть распределена по нескольким недорогим серверам. |
Транзакция поддержки | Поддержка ACID и транзакций | Поддержка разделения и доступности может поставить под угрозу транзакции. Транзакции существуют на уровне, таком как уровень базы данных или уровень документа. |
Единообразие | Сильная консистенция | Это зависит от продукта. Некоторые варианты продуктов обеспечивают прочную согласованность, в то время как другие обеспечивают окончательную согласованность. |
Функция запроса | Его можно использовать с помощью простого в использовании графического интерфейса | Запросы могут потребовать опыта и знаний в области программирования. В отличие от пользовательского интерфейса, он сосредоточен на функциях и программных интерфейсах. |
Соответствие между концепциями MongoDB и Mysql
База данных | База данных |
Стол | Коллекция |
Ряд | Документ |
Столбец / поле | поле |
Индексы | Индексы |
Подключение к таблице | Встраивание и ссылка |
3. Типы данных, поддерживаемые MongoDB
1. ноль
Значение Null используется для представления пустых или несуществующих полей
{ "x" : null }
2. Логическое
Логические типы имеют два значения true и false
{ "x": true }
3. 32-разрядные целые числа
Этот тип не поддерживается в оболочке Mono. JavaScript поддерживает только 64-разрядные числа с плавающей запятой, поэтому 32-разрядные целые числа автоматически преобразуются в 64-разрядные числа с плавающей запятой.
4. 64-разрядные целые числа
Этот тип не поддерживается в оболочке Mono. Оболочка Mongo использует специальный встроенный документ для отображения 64-разрядных целых чисел.
5. 64-разрядное число с плавающей запятой
Числа в оболочке Mongo относятся к этому типу.
{ "pi" : 3.14 }
В JavaScript есть только один тип “число”. Поскольку в MongoDB существует три числовых типа (32-разрядные целые числа, 64-разрядные целые числа и 64-разрядные числа с плавающей запятой), оболочка должна обходить ограничения JavaScript. По умолчанию числа в оболочке обрабатываются MongoDB как числа с двойной точностью. Это означает, что если вы получаете 32-разрядное целое число из базы данных, то при изменении документа и сохранении его обратно в базу данных целое число также преобразуется в число с плавающей запятой, даже если вы сохраняете целое число нетронутым. Поэтому разумно постараться не закрывать весь документ под оболочкой.
Другая проблема заключается в том, что некоторые 64-разрядные целые числа не являются в точности 64-разрядными числами с плавающей запятой. Таким образом, если вы сохраните 64-разрядное целое число и просмотрите его в оболочке, оно будет отображаться как встроенный документ. Но значения, фактически сохраненные в базе данных, являются точными.
32-разрядные целые числа могут быть точно представлены 64-разрядными числами с плавающей запятой, поэтому в них нет ничего особенного.
6. строка
Строки UTF-8 могут быть представлены в виде строковых типов
{ "x" : "abcde" }
7. идентификатор объекта
Идентификатор объекта использует 12 байтов места для хранения, две шестнадцатеричные цифры на байт, 24-разрядную строку.
{ "_id" : ObjectId() }
8. дата
Типы данных хранят метки времени в Bos, а не в часовых поясах.
{ "d" : new Date() }
9. Регулярные выражения
Документы могут содержать регулярные выражения, использующие синтаксис регулярных выражений Javascript.
{ "x" : /^abc/i }
10. код
Документы могут содержать код JavaScript
{ "x" : function(){/********/} }
11. массив
Коллекция или список значений могут быть представлены в виде массива
{ "d" : [1,2,3,4,5] }
12. Встроенные Документы
Документы могут содержать другие документы или они могут быть встроены в качестве значений в родительский документ.
{ "x" : { "y" : "z" } }
13. не определено
Вы также можете использовать неопределенные ((неопределенные) типы в документах (null и undefined-это разные типы в JavaScript).
{ "a" : undefined }
14. Двоичные данные
Двоичные данные могут состоять из строк произвольных байтов. Его можно использовать для хранения двоичных файлов, таких как изображения. Но он недоступен в моно-оболочке.
IV. Заказ справки по оболочке Mongo
1. Справка на системном уровне:справка
> help db.help() help on db methods db.mycoll.help() help on collection methods sh.help() sharding helpers rs.help() replica set helpers help admin administrative help help connect connecting to a db help help keys key shortcuts help misc misc things to know help mr mapreduce # Display all databases show dbs show database names # Display all collections show collections show collections in current database # Display all users of the current database show users show users in current database show profile show most recent system.profile entries with time >= 1ms show logs show the accessible logger names show log [name] prints out the last segment of log in memory, 'global' is default useset current database db.foo.find() list objects in collection foo db.foo.find( { a : 1 } ) list objects in foo where a == 1 it result of the last line evaluated; use to further iterate DBQuery.shellBatchSize = x set default number of items to display on shell exit quit the mongo shell
2. Просмотрите операции, доступные в базе данных:db.help()
> db.help() DB methods: db.adminCommand(nameOrDocument) - switches to 'admin' db, and runs command [just calls db.runCommand(...)] db.aggregate([pipeline], {options}) - performs a collectionless aggregation on this database; returns a cursor db.auth(username, password) db.cloneDatabase(fromhost) - deprecated db.commandHelp(name) returns the help for the command db.copyDatabase(fromdb, todb, fromhost) - deprecated db.createCollection(name, {size: ..., capped: ..., max: ...}) db.createView(name, viewOn, [{$operator: {...}}, ...], {viewOptions}) db.createUser(userDocument) db.currentOp() displays currently executing operations in the db # Delete the database db.dropDatabase() db.eval() - deprecated db.fsyncLock() flush data to disk and lock server for backups db.fsyncUnlock() unlocks server following a db.fsyncLock() db.getCollection(cname) same as db['cname'] or db.cname db.getCollectionInfos([filter]) - returns a list that contains the names and options of the db's collections # View all collections in the current database db.getCollectionNames() db.getLastError() - just returns the err msg string db.getLastErrorObj() - return full status object db.getLogComponents() db.getMongo() get the server connection object db.getMongo().setSlaveOk() allow queries on a replication slave server db.getName() db.getPrevError() db.getProfilingLevel() - deprecated db.getProfilingStatus() - returns if profiling is on and slow threshold db.getReplicationInfo() db.getSiblingDB(name) get the db at the same server as this one db.getWriteConcern() - returns the write concern used for any operations on this db, inherited from server object if set db.hostInfo() get details about the server's host db.isMaster() check replica primary status db.killOp(opid) kills the current operation in the db db.listCommands() lists all the db commands db.loadServerScripts() loads all the scripts in db.system.js db.logout() db.printCollectionStats() db.printReplicationInfo() db.printShardingStatus() db.printSlaveReplicationInfo() db.dropUser(username) db.repairDatabase() db.resetError() db.runCommand(cmdObj) run a database command. if cmdObj is a string, turns it into {cmdObj: 1} db.serverStatus() db.setLogLevel(level,) db.setProfilingLevel(level,slowms) 0=off 1=slow 2=all db.setWriteConcern( ) - sets the write concern for writes to the db db.unsetWriteConcern( ) - unsets the write concern for writes to the db db.setVerboseShell(flag) display extra information in shell output db.shutdownServer() db.stats() db.version() current version of the server
3. Просмотрите операции, доступные в коллекции:Бд. Имя коллекции. помогите ()
> db.user.help() DBCollection help db.user.find().help() - show DBCursor help db.user.bulkWrite( operations,) - bulk execute write operations, optional parameters are: w, wtimeout, j # Number of records in a collection db.user.count( query = {}, ) - count the number of documents that matches the query, optional parameters are: limit, skip, hint, maxTimeMS db.user.countDocuments( query = {}, ) - count the number of documents that matches the query, optional parameters are: limit, skip, hint, maxTimeMS db.user.estimatedDocumentCount( ) - estimate the document count using collection metadata, optional parameters are: maxTimeMS db.user.copyTo(newColl) - duplicates collection by copying all documents to newColl; no indexes are copied. db.user.convertToCapped(maxBytes) - calls {convertToCapped:'user', size:maxBytes}} command db.user.createIndex(keypattern[,options]) db.user.createIndexes([keypatterns], ) # Collection size db.user.dataSize() db.user.deleteOne( filter, ) - delete first matching document, optional parameters are: w, wtimeout, j db.user.deleteMany( filter, ) - delete all matching documents, optional parameters are: w, wtimeout, j db.user.distinct( key, query, ) - e.g. db.user.distinct( 'x' ), optional parameters are: maxTimeMS # Delete collections db.user.drop() drop the collection db.user.dropIndex(index) - e.g. db.user.dropIndex( "indexName" ) or db.user.dropIndex( { "indexKey" : 1 } ) # Delete collections内的所有索引 db.user.dropIndexes() db.user.ensureIndex(keypattern[,options]) - DEPRECATED, use createIndex() instead db.user.explain().help() - show explain help db.user.reIndex() db.user.find([query],[fields]) - query is an optional query filter. fields is optional set of fields to return. e.g. db.user.find( {x:77} , {name:1, x:1} ) db.user.find(...).count() db.user.find(...).limit(n) db.user.find(...).skip(n) db.user.find(...).sort(...) db.user.findOne([query], [fields], [options], [readConcern]) db.user.findOneAndDelete( filter, ) - delete first matching document, optional parameters are: projection, sort, maxTimeMS db.user.findOneAndReplace( filter, replacement, ) - replace first matching document, optional parameters are: projection, sort, maxTimeMS, upsert, returnNewDocument db.user.findOneAndUpdate( filter, update, ) - update first matching document, optional parameters are: projection, sort, maxTimeMS, upsert, returnNewDocument db.user.getDB() get DB object associated with collection db.user.getPlanCache() get query plan cache associated with collection db.user.getIndexes() db.user.group( { key : ..., initial: ..., reduce : ...[, cond: ...] } ) db.user.insert(obj) db.user.insertOne( obj, ) - insert a document, optional parameters are: w, wtimeout, j db.user.insertMany( [objects], ) - insert multiple documents, optional parameters are: w, wtimeout, j db.user.mapReduce( mapFunction , reduceFunction , ) db.user.aggregate( [pipeline], ) - performs an aggregation on a collection; returns a cursor db.user.remove(query) db.user.replaceOne( filter, replacement, ) - replace the first matching document, optional parameters are: upsert, w, wtimeout, j db.user.renameCollection( newName , ) renames the collection. db.user.runCommand( name , ) runs a db command with the given name where the first param is the collection name db.user.save(obj) db.user.stats({scale: N, indexDetails: true/false, indexDetailsKey: , indexDetailsName: }) db.user.storageSize() - includes free space allocated to this collection db.user.totalIndexSize() - size in bytes of all the indexes db.user.totalSize() - storage allocated for all data and indexes db.user.update( query, object[, upsert_bool, multi_bool] ) - instead of two flags, you can pass an object with fields: upsert, multi db.user.updateOne( filter, update, ) - update the first matching document, optional parameters are: upsert, w, wtimeout, j db.user.updateMany( filter, update, ) - update all matching documents, optional parameters are: upsert, w, wtimeout, j db.user.validate( ) - SLOW db.user.getShardVersion() - only for use with sharding db.user.getShardDistribution() - prints statistics about data distribution in the cluster db.user.getSplitKeysForChunks( ) - calculates split points over all chunks and returns splitter function db.user.getWriteConcern() - returns the write concern used for any operations on this collection, inherited from server/db if set db.user.setWriteConcern( ) - sets the write concern for writes to the collection db.user.unsetWriteConcern( ) - unsets the write concern for writes to the collection db.user.latencyStats() - display operation latency histograms for this collection