MongoDB数据库
MongoDB将数据存储为文档 数据结构由键值对组成的,MongoDB的文档类似于json对象 字段的值可以是文档, 数组以及文档数组(包含多个文档的数组)
MongoDB和MySQL概念的区别:
SQL概念 | MongoDB概念 | 解释说明 |
---|---|---|
database | database | 数据库 |
table(表) | collection(集合) | 数据库的表/集合 |
row(一行数据) | document(文档) | 数据记录的行/文档 |
column | field(域) | 字段的列/域 |
index | index | 索引 |
table joins | 无 | 表的联查 |
primary key | primary key | 主键/MongoDB自动将_id作为主键 |
主键
- 文档中的键值都是有序的
- MongoDB区分大小写
- 不能有重复的键, 再次插入会被覆盖掉
- 文档的键为字符串的类型
一. 启动MongoDB数据库
(1) cd mongodb/bin目录
(2) mongod.exe --dbpath = 数据库的安装位置(我的在db/data目录)
(3) 开启一个新的终端
(4) cd mongodb/bin目录
(5) mongo.exe 启动数据库
二. 对于mongo数据库的操作
(1) 查看数据库
show dbs;
(2) 创建或选择数据库
use 库名;
注意:
1.如果库不存在,使用这个语句会创建数据库
2.如果数据库存在,则进行数据库的切换
3.数据库创建出来使用show dbs;
不会显示出来,需要在数据库中插入内容,才能查看到。
(3) 查看当前所在的数据库
(1) 直接输入db
(2) db.getName()
(4) 创建集合
db.createCollection('集合名称')
(5)查看当前的集合
show collections;
(6) 插入文档
db.集合名.insert({'键':'值'})
例如: db.user.insert({'name':'zs', age:18, gender:'male'})
注意:
1,在MongoDB中,对于集合, 文档的操作统一使用db
2,严格区分大小写
3,如果往不存在的集合插入数据,数据插入成功集合被创建
(7) 删除集合
db.集合名.drop()
例如: db.user.drop();
(8) 删除数据库
db.dropDatabase();
三.insert/save文档的添加
(1) insert就是纯添加数据
db.集合名.insert({文档})
(2) insert插入多条数据
db.集合名.insert([{文档1},{文档2},...])
注意:
如果不加[]
,调用insert
不会报错, 但是只有第一条数据能够插入成功。
(3) 版本3.x以后推荐使用的方法
3.1) db.集合名.insertOne()
例如: db.user.insertOne({'name':'ls','age':20,'gender':'female'}) # 如果写多个文档, 也只有第一个文档会被成功插入
3.2) db.集合名.insertMany()
例如: db.user.insertMany([{'name':'aa'},{'name':'bb'}])
3.3) 使用save
save()方法 既可以插入文档,又可以覆盖文档。
- 插入文档
db.user.save({文档}) - 覆盖文档
db.user.save({"_id":ObjectId("5a5f0d610e0a34c28cb79342"), name:'芙蓉姐姐'}) # 将原来的id对应的值进行覆盖,原来的文档删除了, _id 一定要写上ObjectId("xxx"), 当save指定唯一_id的时候为覆盖 否则为添加文档
四. MongoDB的条件操作符
$gt 大于 db.集合名.find({age:{$gt:10}}) # 查找年龄大于10的记录
$gte 大于等于 db.集合名.find({age:{$gte:10}}) # 查找年龄大于等于10的记录
$lt 小于 db.集合名.find({age:{$lt:10}}) # 查找年龄小于10的记录
$lte 小于等于 db.集合名.find({age:{$lte:10}}) # 查找年龄小于等于10的记录
{key: value} 等于 db.集合名.find({age:10}) # 查询年龄为10的记录
$ne 不等于 db.集合名.find({age:{$ne:10}}) # 查询年龄不等于10的记录
使用id进行查询 db.集合名.find({"_id":ObjectId("5a5eef3...")})
/数据/ 包含查询 db.集合名.find({name:/张/}) # 名字包含张的记录
/^数据/ 以..开头 db.集合名.find({name:/^张/}) # 以张为开头的记录
/数据$/ 以..结尾 db.集合名.find({name:/四$/}) # 查询以四结尾的记录
$in 在..里 db.集合名.find({age:{$in:[10,20,30]}}) # 查询年龄的值为10,20,30的记录
$nin 不在..里 db.集合名.find({age:{$nin:[10,20,30]}}) # 查询年龄不为10,20,30的记录
五. update更新文档
语句主体结构:
db.集合名.update(
<query>,
<update>,
{
upsert:<boolean>,
multi:<boolean>
}
)
解释:
<query>:update的查询语句,有点类似sql的where后面的条件
<update>:更新操作。 其中 $inc累加修改; $set直接修改
upsert:当修改的数据不存在的时候是否作为新的数据插入,默认为false
multi:当查询条件查询到多条数据的时候,是修改一条数据还是修改多条数据,默认false只修改一条
实例:对people集合进行操作
(1) 首先在数据库中插入数据
(2) 将名字为张三的第一条数据年龄修改为18
db.people.update({name:'张三'},{$set:{age: 28}})
(3) 当查询条件不能匹配到数据的时候,不会对任何数据进行修改
(4) 如果将upsert设置为true,当查询条件不能匹配到数据的时候,执行插入操作
(5) update语句默认是对一条记录进行修改的,我们可以设置
multi:true
用于对多条记录进行修改, 在这里我们将所有名字以张开头的人的年龄加10岁(6) 和可以使用与操作,将名字为张开头,年龄为29的减10岁
版本3.x以后推荐使用的方法
- db.集合名.updateOne() # 修改一条记录
例如: db.people.updateOne({age:{$in:[38,19]}}, {$inc:{age:10}}) # 可以匹配到多条数据,但是只会修改一条数据,如果设置multi为true也只会修改一条数据 - db.集合名.updateMany() # 修改多条数据
例如:db.people.updateMany({age:{$in:[38,19]}}, {$inc:{age: 10}}) # 修改了多条数据
六. find查询
(1) 查询所有记录
db.集合名.find();
(2) 查询结果指定某个字段进行显示或不显示
db.集合名.find(条件, {name:1, age:true}); # 只返回指定的字段,默认_id是返回的。即返回_id, name和age对应的字段, 使用1或者true都可以
db.集合名.find({}, {name:false, age:0}); # 返回除了name和age的其他字段
注意:
(1) db.集合名.find({}, {name:true, age:false}); #error
错误的写法, 一般情况下,显示和不显示模式不能混用, 上述name只返回name, age返回除了age以外的,产生错误。
(2) db.集合名.find({}, {_id: 0, name: true, age:true}); #ok
_id默认是显示的,需要手动设置为0/false才会隐藏显示
(3) 查询一条记录
db.集合名.findOne(); # 返回了第一条数据
(4) 统计数据条数
db.集合名.find().count();
(5) 将数据展开来查看
db.集合名.find().pretty();
(6) 排序
db.集合名.find().sort({'age':1}); # 其中1为升序, -1为降序
(7) 指定数量的记录
db.集合名.find().sort({age:1}).limit(4); # 安装age升序排序取前4个
(8) 跳过指定数量的记录
db.集合名.find().skip(2); # 跳过2条数据
六. remove删除
(1) 使用remove() 删除
语法格式:
db.集合名.remove(
<query>,
{
justOne:<boolean>,
}
)
解释:
<query>:查询条件
justOne:设置true/1 是否只删除一个,默认为false
# 删除title为aa的
db.集合名.remove({'title':'aa'})
# 删除所有的文档
db.集合名.remove({})
(2) 使用deleteOne() 和deleteMany() 删除
# 删除集合下的所有文档
db.集合名.deleteMany({})
# 删除title为aa的全部文档
db.集合名.deleteMany({'title':'aa'})
# 删除title为aa的第一条文档
db.集合名.deleteOne({'title':'aa'})