MongoDB (操作数据库,操作集合,操作文档)的笔记
https://www.bilibili.com/video/BV1gV411H7jN/?spm_id_from=333.999.0.0&vd_source=92305fa48ea41cb7bedb3ab5e056d42d
b站mongodb的视频链接。
1,MongoDB是什么?
2,MongoDB和Redis的区别
2.1,内存管理机制
2.2,支持的数据结构
2.3,不适用场景
3,可视化工具 Robomongo
mongodb的安装和下载,我是自己在网上搜的下的,忘记在哪下的了。
打开命令: mongod ,要输入数据库命令的话,命令是:mongo
然后就可以输入数据库命令了
我在网页上下载的。连好数据库就是下图。
4,MongoDB数据库的基本操作
4.1,操作数据库
4.1.1,创建数据库
有数据的数据库会被显示出来,这里 sxt 只是被创建出来了,db可以知道当前所在的数据库。
4.1.2,查询数据库
往sxt 数据库插入数据,再去show dbs,就发现有sxt了。
在可视化工具 robo 里也可以看到
4.1.3,删除数据库
4.2,操作集合
4.2.1,创建集合(相当于mysql的表)
集合名和数据库名别重名,因为你删集合,有可能把库删了。下图是在数据库 sxt 里 创建 shsxt 的集合。
查看可视化工具
所以上面的知道就好,不需要创建集合,下图的才是要用的。
4.2.2,删除集合
比如,删除shsxt 这个集合
查看可视化工具,发现也没有数据库 sxt 了,是因为 数据库sxt只有shsxt这一个集合,删了shsxt集合后,数据库sxt就没有数据了,也就显示不出来了,但是sxt还在。
4.3,操作文档
4.3.1,插入文档
4.3.1.1,insert
在可视化工具里输入以下内容
use sxt
user0 = {
"name":"zhangsan",
"age":18,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"BJ"
}
}
db.user.insert(user0)
可视化工具里也能看到插入的信息。
注:_id 字段,这个值必须在user集合中唯一,若不指定主键值,会自动分配一个值。
4.3.1.2,save
用save() 插入user1,指定_id 为2,看可视化工具,发现把 _id 已经改为2了,
user1 = {
"_id":2,
"name":"zhangsan",
"age":18,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"BJ"
}
}
db.user.save(user1)
用save()也能实现修改,把name改成wangwu,查看robo
4.3.1.3,批量插入,insertMany
批量插入user1,user2,user3,user4,user5,我先把数据库的user集合删了,这样好看一点。
user1 = {
"_id":1,
"name":"zhangsan",
"age":1,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"BJ"
}
}
user2 = {
"_id":2,
"name":"lisi",
"age":2,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"SH"
}
}
user3 = {
"_id":3,
"name":"wangwu",
"age":3,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"GZ"
}
}
user4 = {
"_id":4,
"name":"zhaoliu",
"age":4,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"SZ"
}
}
user5 = {
"_id":5,
"name":"tianqi",
"age":5,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"TY"
}
}
db.user.insertMany([user1, user2, user3, user4, user5])
查看robo ,发现都插入了。
4.3.2,更新文档
把 name 为 lisi 的人 改成 user2,就是name和age变了,其他的没变。
user2 = {
"name":"wangwu",
"age":20,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"BJ"
}
}
db.user.update({"name":"lisi"},user2)
在robo发现,确实改了。
注:比如修改的值只有name,age其余属性会被删除,所以改的话,要把原来的数据也加上。
如果把 _id 为2 的人改成 user2,就是把name改成 lisi,(注意看user2 和之前的user2不一样了,没有hobbies和addr)。
user2 = {
"name":"lisi",
"age":20,
}
db.user.update({"_id":2},user2)
robo里 _id为2,但是没有被修改的数据(和之前的user2相比,前提如果是我们想要没有被修改的数据存在)不见了,被删除了
4.3.2.1,再来试一下修改多条数据
我们可以插入一个user6,让user6的name为wangwu。
user6 = {
"name":"wangwu",
"age":20,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"BJ"
}
}
db.user.insert(user6)
把user集合里所有name为wangwu的人改成 wangwu666(multi 为 true),其它没有被修改的数据存在。如果不存在name为wangwu的人,就插入新的(upsert 为 true)。
改之前的
multi必须配合$符号一起使用,否则会无效
$set修改器
$set用来指定一个键的值,如果这个键不存在,则创建它。键可以不加双引号。
db.user.update({"name":"wangwu"},{"$set":{"name":"wangwu666"}},{"upsert":true, "multi":true})
下图显示已经修改。
还可以用 updateMany
db.user.updateMany({"name":"wangwu"},{$set:{"name":"wangwu666"}})
4.3.2.2,增加和减少 $inc
$inc :将 集合中文档的字段的值增加或减少某个值
我们先把user集合删了(我是在robo里手动删的),重新插入一些数据。
user1 = {
"_id":1,
"name":"zhangsan",
"age":1,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"BJ"
}
}
user2 = {
"_id":2,
"name":"lisi",
"age":2,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"SH"
}
}
user3 = {
"_id":3,
"name":"wangwu",
"age":3,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"GZ"
}
}
user4 = {
"_id":4,
"name":"zhaoliu",
"age":4,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"SZ"
}
}
user5 = {
"_id":5,
"name":"tianqi",
"age":5,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"TY"
}
}
db.user.insertMany([user1, user2, user3, user4, user5])
年龄都减1,其中,{} 表示对集合中所有文档进行操作,同时 multi 为 true。
注意:要选中执行。
db.user.update(
{},
{$inc: {"age":-1}},
{"multi":true}
)
年龄都加10,其中,{} 表示对集合中所有文档进行操作,同时 multi 为 true。
db.user.update(
{},
{$inc: {"age":10}},
{"multi":true}
)
4.3.3,删除文档
删除集合中name为 lisi 的人,只删符合条件的第一个文档(justOne 为 true)
db.user.remove({"name":"lisi"},{justOne:true})
这里自己可以一删。
db.user.remove({})
4.3.4,查询文档
db.user.find()
db.user.distinct("name")
4.3.4.1,比较运算(=,!= $ne,> $gt,< $lt,>= $gte,<= $lte)
查 _id 等于3,这个直接查就行
db.user.find({"_id":3})
查 _id 不等于3,用 $ne,!=
db.user.find({"_id":{$ne:3}})
查 _id 大于3,用 $gt,>
db.user.find({"_id":{$gt:3}})
查 _id 小于3,用 $lt,<
db.user.find({"_id":{$lt:3}})
查 _id 大于等于3,用 $gte,>=
db.user.find({"_id":{$gte:3}})
查 _id 小于等于3,用 $lte,<=
db.user.find({"_id":{$lte:3}})
4.3.4.2,逻辑运算($and,$or,$not,且或非,$mod 取余)
查询 _id 大于等于3,小于等于4,这个不用$and,用的是 {"$gte":3, "$lte":4} 中间的 逗号,也表示 and关系。
db.user.find({"_id":{"$gte":3, "$lte":4}})
查询 _id 大于等于3,小于等于4, age 大于等于4。注意格式,find里面是 {} 的文档。
第一种方式:
db.user.find({
"_id":{"$gte":3, "$lte":4},
"age":{"$gte":4}
})
第二种方式(用$and):
db.user.find({
"$and":[
{"_id":{"$gte":3, "$lte":4}},
{"age":{"$gte":4}}
]
})
查询 _id 大于等于0,小于等于1,或者,_id大于等于4,或者,name为 tianqi (用$or)
db.user.find({
"$or": [
{"id":{"$gte":0, "$lte":1}},
{"id":{"gte":4}},
{"name":"tianqi"}
]
})
查询 _id 取余2为1 (用 $mod)
db.user.find({
"_id":{
"$mod":[2,1]
}
})
查询 _id 取余2为1,再取反 (用 $not)
db.user.find({
"_id":{
"$not":{
"$mod": [2,1]
}
}
})
4.3.4.3,成员运算($in,$nin)
查询 age 在 1,2,3之间
db.user.find({
"age":{
"$in":[1,2,3]
}
})
查询 age 不在 1,2,3之间
db.user.find({
"age":{
"$nin":[1,2,3]
}
})
4.3.4.4,type操作符($type)
查询 name 是字符串类型的数据,从表里看到字符串类型 String 对应的数字是 2,所以 $type :2,pretty方法是为了格式化输出结果,就是易读。
db.user.find({
"name":{
"$type":2
}
}).pretty()
4.3.4.5,正则表达式
可以看这个文章 https://m.runoob.com/mongodb/mongodb-regular-expression.html
4.3.4.6,投影(0是隐藏,1是显示)
让_id 为3的人 的 _id 不显示出来,name 和 age显示出来。
db.user.find(
{"_id":3},
{"_id":0, "name": 1, "age":1}
)
4.3.4.7,查数组里的数据($all,. 下标 ,$slice,嵌入文档)
查询hobbies中有read的人
db.user.find({
"hobbies":"read"
})
这里我没展开截屏,太长了,看第一个的也可以
查询hobbies既有read又有music的人 (用 $all)
db.user.find({
"hobbies":{
"$all":["read", "music"]
}
})
查询第2个爱好为read的人(下标从0开始),结果和上图一样。
db.user.find({
"hobbies.1":"read"
})
只查看所有人的第1个到第2个爱好(用到了切片 $slice),也就是把 _id,name,age,addr 这些隐藏起来(用到了 投影 )
db.user.find(
{},
{
"_id":0,
"name":0,
"age":0,
"addr":0,
"hobbies":{"$slice":[0,1]},
})
只查看 所有人的最后两个爱好,最后两个用切片表示就是 $slice:-2
db.user.find(
{},
{
"_id":0,
"name":0,
"age":0,
"addr":0,
"hobbies":{"$slice":-2},
}
)
先看一下刚开始插入的文档,发现 "country":"China" 是嵌入文档。
user6 = {
"name":"wangwu",
"age":20,
"hobbies":["music","read"],
"addr":{
"country":"China",
"city":"BJ"
}
}
查询子文档(嵌入文档)有 "country":"China" 的人
db.user.find(
{
"addr.country":"China"
}
)
4.3.4.8,排序(sort(),1是升序,-1是降序)
按姓名升序查询
db.user.find().sort({"name":1})
4.3.4.9,分页(limit(),skip() )
取2个,跳过0个。
db.user.find().limit(2).skip(0)
同理,可以继续取2个,跳过2个
db.user.find().limit(2).skip(2)
综上,用 pageSize 表示 取几个数据,pageNum 表示 第几页,那跳过几个就可以用 pageSize * (pageNum - 1) 表示(看上面黑色背景图的规律)。
4.3.4.10,统计 ($gt 和 count() )
查询 _id 大于3的人数
db.user.find({_id:{"$gt":3}}).count()