Примечания по обучению 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
use set 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