1. Введение
MongoDB — это система баз данных с открытым исходным кодом, основанная на распределенном хранилище файлов.
MongoDB хранит данные в виде документа, а структура данных состоит из пар ключ-значение (ключ=>значение). Документы MongoDB аналогичны объектам JSON. Значения полей могут содержать другие документы, массивы и массивы документов.
2 Установка (мак)
- установить доморощенный
- Установите mongodb с помощью варева
brew install mongodb
- Визуализатор Робомонго
3 запуск и подключение mongodb (mac)
3.1 Запуск сервера
3.1.1 Шаги запуска
-
- Создайте новый каталог в каталоге, который будет запущен (например:
data
)
- Создайте новый каталог в каталоге, который будет запущен (например:
mkdir data
-
- Введите в командной строке (параметр --dbpath указывает путь к базе данных)
mongod --dbpath='./data'
если он появитсяwaiting for connections on port 27017
Это означает, что запуск прошел успешно.
Примечание: это командное окно нельзя закрывать, закрытие этого окна эквивалентно остановке службы mongodb.
3.1.2 mongod
Описание параметра команды запуска mongod
Опции | значение |
---|---|
--port | Укажите номер порта службы, порт по умолчанию 27017. |
--logpath | Укажите файл журнала MongoDB, обратите внимание, что указанный файл не является каталогом |
--logappend | запись журнала с помощью добавления |
--dbpath | Укажите путь к базе данных |
--directoryperdb | Настройки для каждой базы данных будут сохранены в отдельном каталоге |
3.2 Запуск клиента
- ввод командной строки
mongo
Вы также можете установить хост
mongo --host 127.0.0.1
4 основных понятия MongoDB
-
数据库
Один экземпляр MongoDB может поддерживать несколько независимых баз данных, например, система управления студентами может соответствовать одному экземпляру базы данных. -
集合
Базы данных состоят из коллекций, а коллекция используется для представления сущности, например коллекции учащихся. -
文档
Коллекция состоит из документов Документ представляет собой запись Например, одноклассник Чжан Сан является документом.
Соответствующее соотношение выглядит следующим образом:
5 Операции с базой данных
5.1 Просмотреть все базы данных
show dbs
Возврат следующим образом:
admin 0.000GB
book 0.000GB
leave 0.000GB
local 0.000GB
page 0.000GB
school 0.000GB
students 0.000GB
5.2 Использование базы данных
Пример Переключитесь на базу данных школы:
use school
Возврат следующим образом:
switched to db school
Примечание. Если эта база данных существует, переключитесь на эту базу данных, если эта база данных не существует, вы также можете переключиться
Примечание. Если только что созданной нами базы данных школы нет в списке, для ее отображения нам необходимо вставить некоторые данные в базу данных школы.
db.school.insert({name:'为民小学',age:10});
5.3 Просмотр текущей используемой базы данных
db 或 db.getName()
5.4 Удалить базу данных
db.dropDatabase()
Возврат следующим образом:
{ "dropped" : "school", "ok" : 1 }
6 Операции по сбору
6.1 Просмотр справки коллекции
db.school.help()
Возврат следующим образом:
BCollection help
db.school.find().help() - show DBCursor help
db.school.bulkWrite( operations, <optional params> ) - bulk execute write ...
6.2 Просмотр коллекции в базе данных
show collections
Возврат следующим образом:
grade1
grade2
6.3 Создание коллекций
- Создать пустую коллекцию (
db.createCollection(collection_Name)
)
db.createCollection('grade3')
Возврат следующим образом:
{ "ok" : 1 }
- Создайте коллекцию и вставьте документ (
db.collection_Name.insert(document)
)
db.grade1.insert({name: 'Lily', age: 8})
Возврат следующим образом:
WriteResult({ "nInserted" : 1 })
7 Операции с документами
7.1 Вставка документа
insert
db.collection_name.insert(document)
db.grade1.insert({name: 'Tom', age: 9})
примечание: всякий раз, когда вставляется новый документ, mongodb автоматически генерирует атрибут _id для этого документа. _id должен быть уникальным. _id, используемый для уникальной идентификации документа, также может быть указан напрямую, но если в базе данных уже есть набор Вставка не удастся для этого _id.
{
"_id" : ObjectId("5addbfbb163098017a6a72ed"),
"name" : "Tom",
"age" : 9.0
}
save
db.collection_name.save(document)
примечание: если поле _id не указано, метод save() аналогичен методу insert(). Если поле _id указано, данные для этого _id обновляются.
// insert
db.grade1.insert({_id: '1',name: 'Han Meimei', age: 8})// WriteResult({ "nInserted" : 1 })
// 存在{_id:1},则更新 _id为1的document
db.grade1.save({_id: '1',name: 'Han Meimei', age: 9})// WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
// 不存在{_id:2},则插入一条新文档
db.grade1.save({_id: '2',name: 'Han Meimei', age: 9})// WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : "2" })
Выполнить вставку скрипта
mongo exc_js/1.js
> load exc_js/1.js
7.2 Обновление документации
7.2.1 Синтаксис и описание параметров
db.collection.update(
<query>,
<updateObj>,
{
upsert: <boolean>,
multi: <boolean>
}
)
-
query
Условия запроса, указывающие, какие документы для обновления соответствуют условиям -
update
обновленный объект или указать какой-либо оператор обновления-
$set
Укажите обновленное значение напрямую -
$inc
Накопить на исходной основе
-
-
upsert
Необязательный, этот параметр указывает, следует ли вставлять updateObj, если нет подходящей записи.По умолчанию установлено значение false, которое не вставляется. -
multi
Необязательно. По умолчанию mongodb обновляет только первую найденную запись. Если этот параметр имеет значение true, обновляются все подходящие записи.
7.2.2 Операторы
(1)$inc
{ $inc: { <field1>: <amount1>, <field2>: <amount2>, ... } }
- Накопить на исходной основе (приращение)
// 给 {name: 'Tom'} 的文档的age累加 10
db.grade1.update({name: 'Tom'}, {$inc: {age:10}})
// WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
(2)$push
{ $push: { <field1>: <value1>, ... } }
- добавить элемент в массив
db.grade1.update({name:'Tom'}, {$push: {'hobby':'reading'} })
// WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
// { "_id" : ObjectId("5addbfbb163098017a6a72ed"), "name" : "Tom", "hobby" : [ "reading" ] }
// 不会覆盖已有的
db.grade1.update({name:'Tom'}, {$push: {'hobby':'reading'} })
// WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
// { "_id" : ObjectId("5addbfbb163098017a6a72ed"), "name" : "Tom", "hobby" : [ "reading", "reading" ] }
(3)$addToSet
{ $addToSet: { <field1>: <value1>, ... } }
- Добавить или установить значение в массив,
- да - ничего не делать, нет - добавить
// /第一次没有 huge
db.grade1.update({_id:3}, {$addToSet: {friends:'huge'}})
// WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
// 第二次 有 huge
db.grade1.update({_id:3}, {$addToSet: {friends:'huge'}})
// WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
(4)$pop
{ $pop: { <field>: <-1 | 1>, ... } }
- Удалить первый или последний элемент массива.
- входящий
1
удалить последний элемент - входящий
-1
удалить первый элемент
db.grade1.update({_id:3}, {$pop:{friends: 1}})
// WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
db.grade1.update({_id:3}, {$pop:{friends: -1}})
// WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
(5)$each
{ $addToSet: { <field>: { $each: [ <value1>, <value2> ... ] } } }
- Use with the $addToSet operator to add multiple values to an array if the values do not exist in the .
db.grade1.update({_id:3}, {$addToSet:{friends:{$each: ['huangbo','zhangyixing']}}})
//WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
// 已经有的时候就不会再添加了
db.grade1.update({_id:3}, {$addToSet:{friends:{$each: ['huangbo','zhangyixing']}}})
//WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
{ $push: { <field>: { $each: [ <value1>, <value2> ... ] } } }
- Use with the $push operator to append multiple values to an array .
db.grade1.update({_id:3}, {$push:{friends:{$each: ['huangbo','zhangyixing']}}})
// WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
существует
$addToSet
При использовании в , если он есть, он будет проигнорирован, если нет, то будет добавлен. существует$push
При использовании в , он будет добавлен независимо от того, есть он или нет.
(6)$ne
{field: {$ne: value} }
- not equal
// 给 name为'Han Meimei' && hobby中不等于'reading' && _id不等于'2'的文档 的hobby 属性 添加一个 'drinking'
db.grade1.update({name: 'Han Meimei', hobby:{$ne:'reading'}, _id: {$ne:'2'}}, {$push: {hobby: 'drinking'}})
// WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
(7) $набор
{ $set: { <field1>: <value1>, ... } }
- Установить поля верхнего уровня
- Установить значение вложенных полей (Set Fields in Embedded Documents)
- Изменить указанный элемент индекса
/*
原来的数据:
{_id:3, info:{id: '11'}, friends:['liudehua', 'zhourunfa']}
*/
/*设置字段的第一层的值(Set Top-Level Fields)*/
db.grade1.update({_id:3}, {$set:{"info11":{id:'11'}}})
// WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
/*设置嵌套字段的值 (Set Fields in Embedded Documents)*/
db.grade1.update({_id:3}, {$set:{"info.id":'22'}})
// WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
/*修改指定索引元素*/
db.grade1.update({_id:3}, {$set:{"friends.1":'zhangmanyu'}})
// WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
(8)$unset
{ $unset: { <field1>: "", ... } }
- удалить указанный ключ
// 把 {name: 'Tom'} 的文档中的 age 键给删除掉
db.grade1.update({name: 'Tom'}, {$unset:{'age':''}})
// WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
/* {
"_id" : ObjectId("5addbfbb163098017a6a72ed"),
"name" : "Tom"
}*/
7.3 Удаление документов
- Метод remove используется для удаления данных из коллекции.
грамматика
db.collection.remove(
<query>,
{
justOne: <boolean>
}
)
Параметр Описание
query :(可选)删除的文档的条件。
justOne : (可选)如果设为 true 或 1,则只删除匹配到的多个文档中的第一个。默认为 true
/*{justOne:true} 值删除匹配到的第一条文档*/
db.grade1.remove({'name': 'Han Meimei'}, {justOne: true})
// WriteResult({ "nRemoved" : 1 })
/*删除匹配到的所有文档*/
db.grade1.remove({'name': 'Han Meimei'})
// WriteResult({ "nRemoved" : 2 })
7.4 Запрос документов
7.4.1
грамматика
db.collection_name.find(query, projection);
параметр
query - 使用查询操作符指定选择过滤器
projection - 指定配到到的文档中的返回的字段。
/*projection*/
{ field1: <value>, field2: <value> ... }
/*value:*/
1 or true: 在返回的文档中包含这个字段
0 or false:在返回的文档中排除这个字段
note:
_id
Поле всегда возвращается по умолчанию, если только оно не установлено вручную._id
поле установлено на0
илиfalse
взять каштан
//查询grade1下所有的文档
db.grade1.find()
7.4.2 findOne()
- Вернуть только первый документ, который соответствует
7.4.3 Операторы запросов
(1)$in
- Matches any of the values specified in an array.
- (в диапазоне массива)
//原始数据():
{ "_id" : 1, "name" : "Tom1", "age" : 9 }
{ "_id" : 2, "name" : "Tom2", "age" : 15 }
{ "_id" : 3, "name" : "Tom3", "age" : 11 }
db.grade1.find({age:{$in:[9,11]}})
// { "_id" : 1, "name" : "Tom1", "age" : 9 }
// { "_id" : 3, "name" : "Tom3", "age" : 11 }
(2)$nin
- Matches none of the values specified in an array.
db.grade1.find({age:{$nin:[9,11]}})
// { "_id" : 2, "name" : "Tom2", "age" : 15 }
(3)$not
- Inverts the effect of a query expression and returns documents that do not match the query expression.
db.grade1.find({age:{$not:{$lt:11}}})
//{ "_id" : 2, "name" : "Tom2", "age" : 15 }
//{ "_id" : 3, "name" : "Tom3", "age" : 11 }
(4)$gt
- Matches values that are greater than a specified value.
- больше, чем
(5)$gte
- Matches values that are greater than or equal to a specified value.
- больше или равно
(6)$lt
- Matches values that are less than a specified value.
- меньше, чем
(7)$lte
- Matches values that are less than or equal to a specified value.
- меньше или равно
(8)$ne
- Matches all values that are not equal to a specified value.
- не равно
db.grade1.find({age:{$ne:9}})
// { "_id" : 2, "name" : "Tom2", "age" : 15 }
// { "_id" : 3, "name" : "Tom3", "age" : 11 }
7.4.4 Использование массива
// 原始数据
{ "_id" : 1, "name" : "Tom1", "age" : 9, "friends" : [ "Lily", "Jobs", "Lucy", "Zhang San" ] }
{ "_id" : 2, "name" : "Tom2", "age" : 15, "friends" : [ "Zhange San", "Li Si" ] }
{ "_id" : 3, "name" : "Tom3", "age" : 11, "friends" : [ "Zhange San", "Lily" ] }
db.grade1.find({"friends" : [ "Lily", "Jobs", "Lucy", "Zhang San" ]})
// { "_id" : 1, "name" : "Tom1", "age" : 9, "friends" : [ "Lily", "Jobs", "Lucy", "Zhang San" ] }
db.grade1.find({"friends" : [ "Lily" ]})
// 空
// $all
db.grade1.find({"friends" :{$all: ["Zhang San"]}})
// { "_id" : 1, "name" : "Tom1", "age" : 9, "friends" : [ "Lily", "Jobs", "Lucy", "Zhang San" ] }
// $in
db.grade1.find({"friends" :{$in: ["Zhang San"]}})
{ "_id" : 1, "name" : "Tom1", "age" : 9, "friends" : [ "Lily", "Jobs", "Lucy", "Zhang San" ] }
// $size
db.grade1.find({"friends" :{$size:4}})
//{ "_id" : 1, "name" : "Tom1", "age" : 9, "friends" : [ "Lily", "Jobs", "Lucy", "Zhang San" ] }
// $slice
db.collection.find( { field: value }, { array: {$slice: count } } );
> db.grade1.find({"friends" :{$size:4}}, {"friends":{$slice:2}})
//{ "_id" : 1, "name" : "Tom1", "age" : 9, "friends" : [ "Lily", "Jobs" ] }
7.4.5 $where
-
$where
Два типа параметров могут быть получены и переданы в систему запросов: один представляет собой строку, содержащую выражение JavaScript, а другой — функцию JavaScript. -
$where
Очень гибкий, но требует, чтобы выражение JavaScript или функция JavaScript обрабатывались в каждом документе в коллекции базы данных, поэтому это будет медленнее. -
При ссылке на документ в выражении JavaScript или функции JavaScript используйте
this
илиobj
.
// 数据库数据
{ "_id" : 1, "name" : "Tom1", "age" : 9, "friends" : [ "Lily", "Jobs", "Lucy", "Zhang San" ] }
{ "_id" : 2, "name" : "Tom2", "age" : 15, "friends" : [ "Zhange San", "Li Si" ] }
{ "_id" : 3, "name" : "Tom3", "age" : 11, "friends" : [ "Zhange San", "Lily" ] }
// JS表达式的字符串
> db.grade1.find({$where:'this.name == "Tom1"'})
//{ "_id" : 1, "name" : "Tom1", "age" : 9, "friends" : [ "Lily", "Jobs", "Lucy", "Zhang San" ] }
// 函数
> db.grade1.find({$where: function(){return this.age == 9}})
// { "_id" : 1, "name" : "Tom1", "age" : 9, "friends" : [ "Lily", "Jobs", "Lucy", "Zhang San" ] }
7.4.6 Cursor Methods
Эти методы изменяют способ выполнения базового запроса.
включаютcursor.forEach()
,cursor.map()
,cursor.limit()
,cursor.size()
,cursor.count()
Ждать.
// forEach举例
> var result = db.grade1.find({$where: function(){return this.age >= 9}});
> result.forEach(elem => printjson(elem))
/*{
"_id" : 1,
"name" : "Tom1",
"age" : 9,
"friends" : [
"Lily",
"Jobs",
"Lucy",
"Zhang San"
]
}
{
"_id" : 2,
"name" : "Tom2",
"age" : 15,
"friends" : [
"Zhange San",
"Li Si"
]
}
{
"_id" : 3,
"name" : "Tom3",
"age" : 11,
"friends" : [
"Zhange San",
"Lily"
]
}*/
8 условных операторов
8.1 Условные операторы
-
$gt
- больше, чем -
$gte
- больше или равно -
$lt
- меньше, чем -
$lte
- меньше или равно
// 大于等于
db.grade1.find({age:{$gte:9}})
/*{ "_id" : 1, "name" : "Tom1", "age" : 9, "friends" : [ "Lily", "Jobs", "Lucy", "Zhang San" ] }
{ "_id" : 2, "name" : "Tom2", "age" : 15, "friends" : [ "Zhange San", "Li Si" ] }
{ "_id" : 3, "name" : "Tom3", "age" : 11, "friends" : [ "Zhange San", "Lily" ] }*/
// 大于等于9 并且 小于等于13
db.grade1.find({age:{$gte:9}, age: {$lte:13}})
/*{ "_id" : 1, "name" : "Tom1", "age" : 9, "friends" : [ "Lily", "Jobs", "Lucy", "Zhang San" ] }
{ "_id" : 3, "name" : "Tom3", "age" : 11, "friends" : [ "Zhange San", "Lily" ] }*/
8.2 Запрос с _id
//原始数据
{ "_id" : ObjectId("5ae1b6e3e4366d57f3307239"), "name" : "Tom4" }
> db.grade1.find({_id: '5ae1b6e3e4366d57f3307239'}).count()
// 0
> db.grade1.find({_id:ObjectId('5ae1b6e3e4366d57f3307239')}).count()
// 1
count()
Количество результатов запроса
8.3 Обычное сопоставление
db.collection.find({key:/value/})
// name是以`T`开头的数据
db.grade1.find({name: /^T/})
/*{ "_id" : 1, "name" : "Tom1", "age" : 9, "friends" : [ "Lily", "Jobs", "Lucy", "Zhang San" ] }
{ "_id" : 2, "name" : "Tom2", "age" : 15, "friends" : [ "Zhange San", "Li Si" ] }
{ "_id" : 3, "name" : "Tom3", "age" : 11, "friends" : [ "Zhange San", "Lily" ] }
{ "_id" : ObjectId("5ae1b6e3e4366d57f3307239"), "name" : "Tom4" }*/
9 и и или
9.1 and
db.collection_name.find({field1: value1, field2:value2})
//原始数据
{ "_id" : 1, "name" : "Tom1", "age" : 9, "friends" : [ "Lily", "Jobs", "Lucy", "Zhang San" ] }
{ "_id" : 2, "name" : "Tom2", "age" : 15, "friends" : [ "Zhange San", "Li Si" ] }
{ "_id" : 3, "name" : "Tom3", "age" : 11, "friends" : [ "Zhange San", "Lily" ] }
// and name是以‘T’开头 并且 age是9 的数据
> db.grade1.find({name: /^T/, age: 9})
// { "_id" : 1, "name" : "Tom1", "age" : 9, "friends" : [ "Lily", "Jobs", "Lucy", "Zhang San" ] }
9.2 or
db.collection_name.find({ $or: [{key1: value1}, {key2:value2} ] })
// name 是Tom1 或者 age是11 的数据
> db.grade1.find({$or:[{name: 'Tom1'}, {age: 11}]})
/*{ "_id" : 1, "name" : "Tom1", "age" : 9, "friends" : [ "Lily", "Jobs", "Lucy", "Zhang San" ] }
{ "_id" : 3, "name" : "Tom3", "age" : 11, "friends" : [ "Zhange San", "Lily" ] }*/
9.3 Комбинирование и все
> db.grade1.find({age: 9,$or:[{name: 'Tom1'}, {age: 11}]})
/*{ "_id" : 1, "name" : "Tom1", "age" : 9, "friends" : [ "Lily", "Jobs", "Lucy", "Zhang San" ] }*/
10 Постраничный запрос
10.1 limit
- Прочитать указанное количество записей данных Синтаксис
db.collectoin_name.find().limit(number)
10.2 skip
- пропустить указанный объем данных
db.collectoin_name.find().skip(number)
10.3 sort
- Укажите поле для сортировки в качестве параметра и используйте 1 и -1, чтобы указать, как сортировать, где 1 для возрастания, а -1 для убывания.
db.collectoin_name.find().sort({field:1})
db.collectoin_name.find().sort({field:-1})
10.4 Пейджинг
// 原始数据为 1 2 3 4 5 6 7 8 9
> var pageIndex = 3;
> var pageSize = 3;
> var res = db.grade1.find({}).skip((pageIndex - 1) * pageSize).limit(pageSize).sort({username: 1});
> res
/*{ "_id" : ObjectId("5ae1cbc609f3ac9a41442546"), "username" : "Lily_7", "password" : 7 }
{ "_id" : ObjectId("5ae1cbc609f3ac9a41442547"), "username" : "Lily_8", "password" : 8 }
{ "_id" : ObjectId("5ae1cbc609f3ac9a41442548"), "username" : "Lily_9", "password" : 9 }*/
var res1 = db.grade1.find().skip((pageIndex - 1) * pageSize).limit(pageSize).sort({username: -1});
/*{ "_id" : ObjectId("5ae1cbc609f3ac9a41442542"), "username" : "Lily_3", "password" : 3 }
{ "_id" : ObjectId("5ae1cbc609f3ac9a41442541"), "username" : "Lily_2", "password" : 2 }
{ "_id" : ObjectId("5ae1cbc609f3ac9a41442540"), "username" : "Lily_1", "password" : 1 }*/
примечание: не по порядку
11 Состав ObjectId
Раньше, когда мы использовали реляционные базы данных, такие как MySQL, первичный ключ устанавливался на автоинкремент. Но в распределенной среде этот метод неосуществим, и возникнут конфликты. С этой целью MongoDB использует тип ObjectId в качестве первичного ключа. ObjectId — это 12-байтовая строка типа BSON. В порядке байтов один представляет:
- 4 байта: метка времени UNIX
- 3 байта: указывает на машину, на которой запущена MongoDB.
- 2 байта: указывает процесс, сгенерировавший этот _id
- 3 байта: значение, сгенерированное счетчиком, начиная со случайного числа