MongoDB入门
学习视频:尚硅谷MongoDB基础教程(数据库精讲)
真正的大师永远保持着一颗学徒的心
目录
MongoDB简介
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
安装
官网下载:https://www.mongodb.com/try/download/community
Windows仓库下载地址:https://www.mongodb.org/dl/win32
Linux仓库下载地址:https://www.mongodb.org/dl/linux
安装步骤省略
我是使用树莓派安装,推荐文章:树莓派3B 使用 Docker 安装 MongoDB
三个概念
数据库(database)
MongoDB 中多个文档组成集合,多个集合组成数据库。一个MongoDB 实例可以承载多个数据库。
集合(collection)
集合就是一组文档,类似于关系数据库中的表。集合是无模式的,集合中的文档可以是各式各样的。
文档(document)
文档是 MongoDB 中数据的基本单位,类似于关系数据库中的行(但是比行复杂)
在MongoDB中,数据库和集合都不需要手动创建,当我们创建文档时,如果文档所在的集合或数据库不存在,就会自动创建数据库或集合
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pMf3eO60-1594994647664)(4265335C9F2E4B1080A11107F4324979)]
基本指令
show dbs & show databases
:显示全部的数据库use <db>
:进入到指定数据库中,如果不存在就创建db
:返回当前所在数据库名称show collections
:显示当前数据库中全部的集合
数据库CRUD操作
新增
MongoDB 使用 insert() 或 save() 方法向集合中插入文档,语法如下:
db.<collection_name>.insert(document)
向名为collection_name的集合中插入一个文档
//向名为study的数据库中的名为user集合插入一条数据
use study
db.user.insert({username: 'Esion', password: '123456'})
//---结果---
//WriteResult({ "nInserted" : 1, "writeConcernError" : [ ] })
向名为collection_name的集合中插入多个文档
db.user.insert([
{username: 'zbj',password: '1234'},
{username: 'shs',password: '1234'}
])
//---结果---
// 1
BulkWriteResult({
"nRemoved" : 0,
"nInserted" : 2,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"writeErrors" : [ ]
})
当我们向集合插入文档时,如果没有给文档指定_id属性,则数据库会自动为文档添加
该属性作为文档的唯一标识,主键
_id我们也可以自己指定,数据库就不会自动生成
如果我们自己指定,也要保持唯一性
db.<collection_name>.save(document)
//向名为study的数据库中的名为user集合插入一条数据
use study
db.user.save({username: 'Esion', password: '123456'})
//---结果---
//WriteResult({ "nInserted" : 1, "writeConcernError" : [ ] })
两者区别
- save():如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.collection.insertOne() 或 db.collection.replaceOne() 来代替。
- insert(): 若插入的数据主键已经存在,则会抛异常,提示主键重复,不保存当前数据。
在MongoDB3.2版本之后,插入一个是insertOne,插入多个事insertMany
查看更多:https://docs.mongodb.com/manual/tutorial/insert-documents/
查询
下方会会写上等价的SQL语句做对比
db.<collection_name>.find(document)
查询我们当前集合中的所有符合条件的文档
查询全部
db.user.find({})
//---结果---
// 1
{
"_id": ObjectId("5f1129e3ea2f0000e9002003"),
"username": "Esion",
"password": "123456"
}
select * from user
按平等条件查询
db.user.find({ _id: ObjectId("5f112f45ea2f0000e9002005"), username: 'zbj'})
//---结果---
// 1
{
"_id": ObjectId("5f112f45ea2f0000e9002005"),
"username": "zbj",
"password": "1234"
}
select * from user where id = ObjectId("5f112f45ea2f0000e9002005") and username = 'zbj'
使用查询运算符指定条件
db.user.find( { username: { $in: [ "swk", "shs" ] } } )
//---结果---
// 1
{
"_id": ObjectId("5f112ea9ea2f0000e9002004"),
"username": "swk",
"password": "1234"
}
// 2
{
"_id": ObjectId("5f11373bea2f0000e9002007"),
"username": "shs",
"password": "1234"
}
// 3
{
"_id": ObjectId("5f113787ea2f0000e9002009"),
"username": "shs",
"password": "1234"
}
select * from user where username in ['swk', 'shs']
AND
db.user.save({_id: 'hello', username: 'Esion', password: '123456', age: 15})
db.user.save({_id: 'word', username: 'qmlc', password: '123456', age: 31})
db.user.find( { password: "123456", age: { $lt: 30 } } )
//---结果---
// 1
{
"_id": "hello",
"username": "Esion",
"password": "123456",
"age": 15
}
select * from user where password = 123456 and age < 30
OR
db.user.find( { $or: [ { username: "qmlc" }, { age: { $lt: 30 } } ] } )
//---结果---
// 1
{
"_id": "hello",
"username": "Esion",
"password": "123456",
"age": 15
}
// 2
{
"_id": "word",
"username": "qmlc",
"password": "123456",
"age": 131
}
select * from username where username = 'qmlc' or age < 30
AND 和 OR
db.user.find( {
status: "A",
$or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
} )
SELECT * FROM user WHERE status = "A" AND ( qty < 30 OR item LIKE "p%")
db.<collection_name>.findOne(document)
返回符合条件的第一个文档,用法与find一样
findOne返回的是一个对象,find返回的是一个数组
参考文档:https://docs.mongodb.com/manual/reference/method/db.collection.findOne/#db.collection.findOne
db.<collection_name>.find().count()
查询全部文档的数量
修改
db.collection.update(<query>, <update>, <options>)
db.collection.updateOne(<filter>, <update>, <options>)
db.collection.updateMany(<filter>, <update>, <options>)
db.collection.replaceOne(<filter>, <update>, <options>)
db.collection.update(<query>, <update>, <options>)
db.user.update({username: 'qmlc'}, {age: 32})
//---结果---
// 1
WriteResult({
"nMatched" : 1,
"nUpserted" : 0,
"nModified" : 1,
"writeConcernError" : [ ]
})
db.user.find()
//---结果---
{
"_id": "word",
"age": 32
}
注意:update默认情况下会使用新对象来替换就对象
如果只要修改指定的属性,而不是替换,需要使用“修改操作符”来完成修改
$set
:设置,可以用来修改文档中的指定属性
db.user.find()
//---结果---
{
"_id": "word",
"username": "qmlc",
"password": "123456",
"age": 32
}
db.user.update({username: 'qmlc'}, {$set: {age: 31}})
//---结果---
WriteResult({
"nMatched" : 1,
"nUpserted" : 0,
"nModified" : 1,
"writeConcernError" : [ ]
})
db.user.find()
//---结果---
{
"_id": "word",
"username": "qmlc",
"password": "123456",
"age": 31
}
如果对象不存在则会新建,这个只会修改第一个符合条件的文档
$unset
:可以删除文档的指定属性
db.collection.updateOne(<filter>, <update>, <options>)
修改第一个符合条件的文档
db.collection.updateMany(<filter>, <update>, <options>)
修改全部符合条件的文档
删除
db.collection.deleteMany()
db.collection.deleteOne()
db.collection.remove(<filter>, <justOne>)
db.collection.remove()
删除符合条件的文档(默认全部)
db.user.remove({_id: 'hello'})
//---结果---
WriteResult({ "nRemoved" : 1, "writeConcernError" : [ ] })
如果删除一个的文档,第二个参数后面是true或1
db.user.remove({_id: 'hello'}, 1)
db.collection.deleteOne()
删除第一个符合条件的文档
db.collection.deleteOne()
删除全部符合条件的文档
如果只传递一个空对象作为参数,则会删除全部文档(性能略差,因为他会一个一个删除),所以可以直接集合
db.user.drop()
,但remove只是删除文档,但是不删除集合,集合还在
db.dropDatabase()
删除数据库
一般数据库中的数据都不会删除,所以删除的方法很少调用
一般在数据中添加一个字段来表示这个数据是否被删除
文档间的关系
一对一(one-to-one)
一个文档对应另一个文档
在MongoDB中,我们可以通过内嵌文档的形式来体现一对一的关系
一对多(one-to-many)
一个文档对应多个文档
也可以通过内嵌文档映射一对多的关系
在多的那个文档增加一个字段指向一个文档的_id,就可以实现一对多