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()