заметки по базовым знаниям mongodb

база данных MongoDB

Введение в MongoDB#

MongoDB — это база данных документов с открытым исходным кодом, основанная на распределенном хранилище файлов. Написан на языке С++. Он направлен на предоставление высокопроизводительных, высокодоступных и масштабируемых решений для хранения данных для веб-приложений.

Преимущества MongoDB.

MongoDB优点

Преимущества MongoDB

Сценарии использования MongoDB#

  • кеш данных

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

  • Хранилище объектов и json

    Формат данных MongoDB BSON (Binary JSON) очень подходит для хранения и запросов в формате документа, а хранилище в формате JSON ближе всего к реальной объектной модели, что удобно для разработчиков и облегчает быструю разработку и итерацию.Гибкий режим позволяет вам избегайте изменения потребностей, вместо этого часто изменяйте поля и структуры базы данных.

  • Сценарий высокой масштабируемости

    MongoDB упрощает горизонтальное масштабирование сервисных возможностей MongoDB с помощью сегментированных кластеров.

  • Слабый транзакционный бизнес

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

mongodb版本特性介绍

Введение в версию mongodb

Концепции MongoDB#

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

Концепции MongoDB Основные понятия реляционной базы данных (sql) инструкция
database database база данных
table collection Таблица/коллекция базы данных
row document Строка данных/документ
column filed поле данных/домен
index index показатель

MongoDB数据关系图

Диаграмма взаимосвязи данных MongoDB

база данных#

  • В MongoDB можно создать несколько баз данных.

  • База данных MongoDB по умолчанию — «db», которая хранится в каталоге данных.

собирать#

  • Имя коллекции не может начинаться с «система».

  • Формат каждых данных (строки) в таблице (таблице) в реляционной базе данных предопределен заранее, при этом формат данных документа (документа) в коллекции (коллекции) в MongoDB не фиксирован, т.е. может вставить следующие данные в единый документ.

{"site":"www.wuhuan.me"}
{"site":"www.baidu.com","name":"百度"}

Документация#

  • Значением в документе может быть не только строка в двойных кавычках, но и несколько других типов данных (или даже весь встроенный документ)

Например: в реляционной базе данных естьstudentsстол и курсТаблица, структура и данные таблицы следующие:

студенческий стол

id name sex age
1 Ли Лей 0 12
2 Хан Мэймэй 1 12

таблица курсов

id course_id course_name score user_id
1 1 язык 99 1
2 2 математика 100 1
3 1 язык 96 2
4 2 математика 98 3

Вышеуказанные данные и структуры могут быть представлены в MongoDB с помощью встроенных документов (один ко многим):

{
  "_id":ObjectId("5349b4ddd2781d08c09890f3"),
  "name":"李雷",
  "sex":"0",
  "age":"12",
  "course":[{
    "course_id":1,
    "course_name":"语文",
    "score":99,
  },{
    "course_id":2,
    "course_name":"数学",
    "score":100,
  }]
}
{
  "_id":ObjectId("5349b4ddd2781d08c09890f4"),
  "name":"韩梅梅",
  "sex":"1",
  "age":"12",
  "course":[{
    "course_id":1,
    "course_name":"语文",
    "score":96,
  },{
    "course_id":2,
    "course_name":"数学",
    "score":98,
  }]
}
  • Пары ключ/значение в документе упорядочены, а ключи в документе не могут повторяться и чувствительны к регистру.

тип данных#

тип данных описывать
String нить. Обычно используемые типы данных для хранения данных. В MongoDB разрешены только строки в кодировке UTF-8.
Integer Целочисленное значение. Используется для хранения значений. Он может быть 32-битным или 64-битным в зависимости от используемого вами сервера.
Boolean Логическое значение. Используется для хранения логических значений (true/false).
Double Значение двойной точности с плавающей запятой. Используется для хранения значений с плавающей запятой.
Min/Max keys сравнивает значение с самым низким и самым высоким значением элемента BSON (двоичный JSON).
Array Используется для хранения массива или списка или нескольких значений в качестве ключа.
Timestamp метка времени. Запишите, когда документ был изменен или добавлен.
Object Для встроенных документов.
Null Используется для создания нулевых значений.
Symbol символ. Этот тип данных в основном эквивалентен строковому типу, за исключением того, что он обычно используется в языках, использующих специальные символьные типы.
Date дата и время. Сохраняет текущую дату или время в формате времени UNIX. Вы можете указать свою собственную дату и время: создайте объект Date и передайте информацию о годе, месяце и дне.
Object ID Идентификатор объекта. Идентификатор, используемый для создания документа.
Binary Data бинарные данные. Используется для хранения двоичных данных.
Code тип кода. Используется для хранения кода JavaScript в документе.
Regular expression Тип регулярного выражения. Используется для хранения регулярных выражений.

ObjectId#

Документы MongoDB должны иметь значение по умолчанию_idключ и в комплекте_idВсегда уникальный._idЗначение ключа может быть любого типа, по умолчанию используется объект ObjectId, который автоматически создается базой данных MongoDB. Основная причина, по которой MongoDB использует objectId вместо обычной практики (автоматическое увеличение первичного ключа), заключается в трудоемкости и длительности синхронизации и автоматического увеличения первичного ключа на нескольких серверах (распределенных).

ObjectIdсостоит из 12 байтовBSONсочинение

  • Первые 4 байта представляют временную метку

  • Следующие 3 байта — это идентификационный код машины.

  • Следующие два байта состоят из идентификатора процесса (PID).

  • Последние три байта являются случайными числами.

Создать новый идентификатор объекта

Мы можем создать новый ObjectId в командной строке с помощью следующего оператора

> newId=ObjectId()

Приведенный выше оператор вернет уникальный _id

ObjectId("1249b4ddd2712d08c09890f3")

Также можно заменить ObjectId, автоматически сгенерированный MongoDB, на сгенерированный ObjectId.

Базовое использование MongoDB#

Установить базу данных#

Установить MongoDB на Windows относительно просто на официальном сайте.Адрес загрузки MongoDBЗагрузите соответствующий установочный пакет Windows и установите его одним щелчком мыши.

После установки не забудьтеMongoDBв каталоге установкиbinКаталог добавляется в системные переменные окружения.

запустить базу данных#

Запустите базу данных с помощьюmongodЗаказ

  • Способ 1: Запустите в обычном режиме
> mongod --dbpath  E:\MongoDB\data\db  #不使用默认端口的话可以加上--port=[端口号]参数

E:\data\dbпуть к файлу данных

  • Способ 2: Запуск через конфигурационный файл
> mongod --config E:\MongoDB\mongo.conf

E:\MongoDB\mongo.confДля пути к файлу конфигурации содержимое файла конфигурации:

# 服务端口
port=27017
# 数据文件路径
dbpath=E:\mongondb\data\db 
# 日志文件路径
logpath=E:\mongondb\log\mongon.log
# 打开日志输出操作
logappend=true
# 不使用任何的验证方式登录
noauth=true

Подключиться к базе данных#

Подключиться к базе данных с помощьюmongo [,链接字符串]Стандартный синтаксис для подключения к URL-адресу выглядит следующим образом.

mongodb://[username:password@]host[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
  • Войдите на локальный сервер базы данных по умолчанию, без имени пользователя и пароля, порт по умолчанию27017, ссылка по умолчаниюdbбаза данных
> mongo mongodb://localhost/db 

или

> mongo 
  • Используйте имя пользователя admin и пароль 123456 для входа в тестовую базу данных с локальным портом 27017.
> mongo mongodb://admin:123456@localhost:27017/test

создать базу данных#

Создайте базу данных с помощьюuse [数据库名], например, для созданияtest123база данных

> use test123
switched to db test123
> db
test123

Для отображения всех текущих баз данных вы можете использовать командуshow dbs

> show dbs
db     0.001GB
local  0.000GB

Почему мы просто не создалиtest123Что? Это потому, что в базе пока нет контента, и мы спрашиваемtest123вставлятьdb.[集合名称].insert(json格式的数据对象)Часть данных, посмотрите еще раз!

> show dbs
db     0.001GB
local  0.000GB
> use test123
switched to db test123
> db
test123
> db.coll.insert({"title":"not data!"})
WriteResult({ "nInserted" : 1 })
> show dbs
db       0.001GB
local    0.000GB
test123  0.000GB

Проверятьdb.[集合名称].find()только что добавленные данные

> use test123
switched to db test123
> db.coll.find()
{ "_id" : ObjectId("5a66e39914fea5f8ff237420"), "title" : "not data!" }

Используйте команду use для создания базы данных, если она не существует, и переключитесь на указанную базу данных, если она существует.

удалить базу данных#

удалить базу данных с помощьюdb.dropDatabase()функция

Сначала просмотрите все базы данных

> show dbs
db       0.001GB
local    0.000GB
test123  0.000GB

Затем переключитесь на базу данных, которую нужно удалить.test123

> use test123
switched to db test123

удалить текущую базу данных

> db.dropDatabase()
{ "dropped" : "test123", "ok" : 1 }  #删除成功

увеличение данных#

Методы добавления данных: insert(), insertOne(), insertMany()

добавить часть данных

/** insert()方法 **/

> db.person.insert({name:"张三",age:18,sex:"男"});
WriteResult({ "nInserted" : 1 })
> db.person.find()                             });
{ "_id" : ObjectId("5a7941c65f6d5986321c8416"), "name" : "张三", "age" : 18, "sex" : "男" }

/** insertOne()方法插入一条数据 **/

> db.person.insertOne({name:"张三",age:18,sex:"男"});
{                                               dered:true})
        "acknowledged" : true,
        "insertedId" : ObjectId("5a7965855f6d5986321c8422")
}
> db.person.find()
{ "_id" : ObjectId("5a7965855f6d5986321c8422"), "name" : "张三", "age" : 18, "sex" : "男" }
>

Добавить несколько фрагментов данных

Способ 1. Поместите данные для вставки в массив для пакетной вставки.


/** insert()方法 **/

> db.person.insert( [ {name:"张三",age:18,sex:"男"}, {name:"李四",age:21,sex:"女"}, {name:"王五",age:20,sex:"男"}, {name:"赵六",age:19,sex:"女"} ],{ordered:true})
BulkWriteResult({
        "writeErrors" : [ ],
        "writeConcernErrors" : [ ],
        "nInserted" : 4,
        "nUpserted" : 0,
        "nMatched" : 0,
        "nModified" : 0,
        "nRemoved" : 0,
        "upserted" : [ ]
})

/** insertMany()方法 **/

> db.person.insertMany( [ {name:"张三",age:18,sex:"男"}, {name:"李四",age:21,sex:"女"}, {name:"王五",age:20,sex:"男"}, {name:"赵六",age:19,sex:"女"} ],{ordered:true})
{
        "acknowledged" : true,
        "insertedIds" : [
                ObjectId("5a7969ec5f6d5986321c8430"),
                ObjectId("5a7969ec5f6d5986321c8431"),
                ObjectId("5a7969ec5f6d5986321c8432"),
                ObjectId("5a7969ec5f6d5986321c8433")
        ]
}

Дополнительный параметр {ordered:true} добавляется для указания упорядоченной вставки. Когда упорядоченная вставка сталкивается с исключением, она возвращается напрямую и не будет продолжать вставлять остальные записи документа в массив. Если этот параметр не добавлен или {ordered:false} является неупорядоченной вставкой, неупорядоченная вставка будет продолжать выполняться при возникновении исключения.

Способ 2. Используйте объект bluk для пакетного добавления данных.

  • Шаг 1: Инициализируйте объект пакетной операции
    var bulk = db.person.initializeUnorderedBulkOp();
    
  • Шаг 2: Добавьте данные, которые будут добавлены к объемному объекту

    bulk.insert({name:"赵六",age:19,sex:"女"});
    bulk.insert({name:"赵六",age:19,sex:"女"});
    bulk.insert({name:"赵六",age:19,sex:"女"});
    
  • Шаг 3: Способ фактического добавления в базу данных

bulk.execute();

Чтобы вставить документ, вы также можете использовать команду db.collectionname.save(document). Если поле _id не указано, метод save() аналогичен методу insert(). Если поле _id указано, данные для этого _id обновляются.

Метод insert() может вставлять либо массив, либо объект, метод insertOne() может вставлять только объект, insertMany() может вставлять только массив, insert() возвращает количество успешно вставленных записей, а метод insertOne() и Метод insertMany() возвращает флаг успеха и _objectId успешной вставки

запрос данных#

Команда запроса: find(), findOne()

findOne()Результат запроса метода был отформатирован и выведен,find()метод форматирования выходных данных для вызоваpertty()Модифицированные методы запросов также могут дать тот же эффект.

Пример:db.person.find({age:18})
Запросить всю информацию о людях, чей возраст равен 18

Пример:db.person.find({age:{$gt:18}},{name:1,sex:1})
Запросить имена и пол лиц старше 18 лет в коллекции лиц в базе данных db.

Примечание. Если возраст менее 18 лет, вы можете использовать оператор $lt. Второй параметр {name:1,sex:1} указывает отображаемое поле. Если вы не хотите отображать поле, не его не нужно писать, если второй параметр {name :1}, то отображается только поле name, если второй параметр не прописан целиком, то по умолчанию отображаются все поля

Способы изменения запроса:limit()【Ограниченное количество записей】,sort()【Сортировать】,skip()【перепрыгни】,pretty()【Формат украшения】

Пример:db.person.find({age:{$gt:18}},{name:1,sex:1,age:1}).sort({age:-1}).limit(3).skip(1).pretty()
Запросите имена и пол людей старше 18 лет в коллекции лиц в базе данных db, затем отсортируйте их в порядке убывания возраста, затем возьмите первые три элемента отсортированных данных, а затем пропустите коллекцию после одного элемента данные.

Примечание: [-1] в sort({age:-1}) означает порядок убывания, если порядок возрастания можно записать как sort({age:1}).

удаление данных#

Метод удаления: remove(), drop()

1. Разница между методами remove() и drop()

Пример:db.person.remove({})
Передача пустого числового объекта в методе удаления приведет к удалению всех документов в коллекции person в базе данных db, но не удалит индекс

Пример:db.person.drop()
Удалит все документы в коллекции людей в базе данных db, а также удалит все индексы в коллекции людей. более высокая эффективность.

2. Удалить документы, соответствующие условиям

Пример:db.person.remove({name:"张三"})
Удалите все документы, чье имя равно Zhang San в коллекции людей в базе данных db.

3. Удалить запись

Пример:
метод 1db.person.remove({name:"张三"},{justOne:true});
Способ 2db.person.remove({name:"张三"},1);

Удалять только те документы, которые соответствуют условию

модификация данных#

Способ модификации: обновить()

1,$setоператор
Пример:db.person.update({name:"张三"},{$set:{age:19}})
Измените возраст человека по имени Чжан Сан на 19 лет и измените только одну запись.

2,$currentDateРоль оператора
Пример:db.person.update({name:"张三"},{ $set:{age:"123456"},$currentDate: { lastModified: true }})
Добавить поле последнего изменения в текущий измененный документ

3.{multi:true}Роль параметров
Пример:db.person.update({name:"张三"},{$set:{age:20},$currentDate: { lastModified: true }},{multi:true})
По умолчанию изменяется только один документ, который соответствует условиям. Если несколько документов соответствуют условиям и нуждаются в изменении, вам нужно только добавить третий параметр {multi:true} для изменения нескольких документов.

4.upsertРоль опционов
Пример:db.person.update({name:"张三"},{name:'张三三',age:20,sex:"男"},{upsert:true})
По умолчанию, если документ не соответствует условию обновления, обновление ничего не сделает.Если добавлен параметр {upsert:true}, если соответствующий документ не найден, будет вставлен новый документ.

Примечание: mongondb автоматически изменяет исходный тип данных в документе в соответствии с типом данных при изменении данных. Например, возраст в документе является числовым типом. Когда вы изменяете запись, вы передаете возраст в виде строки , то в этом документе тип поля age становится строковым.

показатель#

Индексы обычно могут значительно повысить эффективность запросов, как и каталог книг.Если индекса нет, mongodb будет сканировать каждый файл в коллекции и выбирать данные, соответствующие условиям запроса.Когда количество данных велико, это запрос относительно скорость очень низкая

использоватьdb.集合名称.getIndexes()получить индекс коллекции

> db.person.getIndexes()
[
        {  //person集合的默认索引
                "v" : 1, //升序排列
                "key" : {
                        "_id" : 1 //索引列
                },
                "name" : "_id_", //索引名称
                "ns" : "test.person" //指定集合
        }
]

создать индекс

Как создать индекс:createIndex()

Пример:db.person.createIndex({"name":1})
Создайте восходящий индекс для поля имени в коллекции людей

> db.person.getIndexes()
[
        { // 默认索引
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "test.person"
        },
        { //新创建的索引
                "v" : 1,
                "key" : {
                        "name" : 1
                },
                "name" : "name_1",
                "ns" : "test.person"
        }
]

падение индекса

Для удаления индекса используйте команду:dropIndex()
Пример: db.person.dropIndexes({"name":1})

> db.person.getIndexes() //查询索引
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "test.person"
        },
        {
                "v" : 1,
                "key" : {
                        "name" : 1
                },
                "name" : "name_1",
                "ns" : "test.person"
        }
]
> db.person.dropIndex({"name":1})  //删除
{ "nIndexesWas" : 2, "ok" : 1 }
> db.person.getIndexes() //查询索引
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "test.person"
        }
]

Чтобы удалить все индексы, используйте команду:dropIndexes()
Пример: db.person.dropIndexes()

> db.person.getIndexes() //查询索引
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "test.person"
        },
        {
                "v" : 1,
                "key" : {
                        "name" : 1
                },
                "name" : "name_1",
                "ns" : "test.person"
        }
]
> db.person.dropIndexes() //删除全部索引
{
        "nIndexesWas" : 2,
        "msg" : "non-_id indexes dropped for collection",
        "ok" : 1
}
> db.person.getIndexes() //查询索引
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "test.person"
        }
]

Удаление всех индексов относится к: индексам с именем, отличным от _id_ (индекс по умолчанию)

экспортировать файл данных#

mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件存在路径 
  • Если нет пользователя who, можно убрать -u и -p.
  • Если вы экспортируете локальную базу данных, вы можете удалить -h.
  • Если это порт по умолчанию, вы можете удалить --port.
  • Если вы хотите экспортировать все базы данных, вы можете удалить -d.

Экспорт всех баз данных

mongodump -h 127.0.0.1 -o E:\mongondb\dump 

импортировать файл данных#

> mongorestore -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 --drop 文件存在路径 

--drop означает сначала удалить все записи, а потом восстановить.

Импорт всех баз данных

> mongorestore E:\mongondb\dump 

Импорт базы данных test123

> mongorestore -d user E:\mongondb\dump\test123  #test123这个数据库的备份路径  



Конец этой статьи

Если эта статья неверна, пожалуйста, дайте мне знать!

Оригинальное название:основы mongodbОригинальная ссылка:Вууху. Пять колец. Что/2018/01/22/…

Заявление об авторских правах: Бесплатная перепечатка - некоммерческая - не производная - сохранить авторство и исходную ссылку |Creative Commons BY-NC-ND 3.0