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

 

posted @ 2023-12-06 23:25  银河小船儿  阅读(71)  评论(0编辑  收藏  举报