MongoDB超详细保姆级入门教程!

1. 数据库简介

SQL:结构化查询语言




2. MongoDB简介

BSON:二进制JSON




3. 将MongoDB设置为系统服务

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Et9WvF22-1617710052599)(E:\学习笔记\图片\image-20201014154908638.png)]




4. MongoDB的基本操作

在MongoDB中,数据库和集合都不需要我们手动创建,当我们创建文档时,如果文档所在的集合或数据库不存在,她会自动创建数据库和集合!

  • 基本指令

    • show dbs:显示当前所有数据库

      show database:显示当前所有数据库

    • use 数据库名:进入到指定的数据库中(可以不存在)

    • db:表示我们当前所处的数据库

    • show collections:显示我们数据库中所有的集合

  • CRUD操作

    • 向数据库中插入文档

      db..insert(doc):向集合中插入文档

      向test数据库中的stus集合中插入一个新的学生对象

      db.stus.insert ( {name:“孙悟空”,age:18,gender:”男“} )

    • 查询集合中的所有文档

      db..find()




5. 安装图形化工具

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6u01LVD3-1617710052601)(E:\学习笔记\图片\image-20201014201630172.png)]




6. 插入文档

db.collection.insert()

  • 向集合中插入一个或多个文档
  • 当我们向集合中插入文档时,如果没有给文档指定_id属性,则数据库会自动给文档添加_id
    该属性用来作为文档的唯一标识
  • _id可以自己指定,如果我们指定了,数据库就不会再添加了,如果自己指定_id必须也确保唯一性
    • db.collection.insertOne():插入一个文档对象
  • db.collection.insertMany():插入多个文档对象
db.stus.insert({
    
    name:"冉海锋",age:28,gender:"男"})
db.stus.find()db.stus.insert([
    {
    
    name:"沙和尚",age:36,gender:"男"},
    {
    
    name:"白骨精",age:16,gender:"女"},
    {
    
    name:"蜘蛛精",age:14,gender:"女"}
])
  • $push:用于向数组中添加一个新的元素

    db.user.update({username:"tangseng"},{$push:{"hobby.movies":"Interstellar"}})
    
  • $addToSet:向数组中添加一个新元素(类似于向set集合中添加,如果数组中已经存在了该元素,则添加失败,因为不可重复

    db.user.update({
          
          username:"tangseng"},{
          
          $addToSet:{
          
          "hobby.movies":"Interstellar"}})
    



7. 查询文档

db.collection.find()

  • find()用来查询集合中所有符合条件的文档

  • find()可以接收一个对象作为条件参数

    • { }:表示所有文档
    • { 属性:值 }:查询属性是指定值的文档
    • 返回值是一个数组
  • db.collection.findOne()

    • 用来查询集合中符合条件的第一个文档

    • 返回的是一个文档

  • db.stus.find({}).count():查询所有结果的数量

db.stus.find({
    
    name:"冉海锋"})
db.stus.findOne({
    
    name:"冉海锋"})
db.stus.find({
    
    name:"冉海锋"})[0]
db.stus.find({
    
    }).length()



8. 修改文档

  • db.collection.update(查询条件,新对象)
    • update()默认情况下会使用新对象来替换旧对象
    • update()默认只会修改一个对象

如果需要修改指定的属性,而不是替换,需要使用 “修改操作符” 来完成修改

  • $set:可以用来修改文档中的指定属性
  • $unset:可以用来删除文档的指定属性

db.collection.updateMany():同时修改多个符合条件的文档

db.collection.updateOne():修改一个符合条件的文档

db.collection.replaceOne():替换一个符合条件的文档

  • MongoDB的文档的属性值也可以是一个文档,当一个文档的属性值是文档时,我们称这个文档为内嵌文档

  • MongoDB支持直接通过内嵌文档的属性进行查询,如果要查询内嵌文档可以则可以通过==.的形式来匹配,且属性名必须使用引号==,双引号单引号都可以

    db.user.find("hobby.movies""hero")
db.stus.find()

db.stus.update(
    {
    
    name:"沙和尚"},{
    
    age:28}
)

db.stus.update(
    {
    
    "_id" : ObjectId("5f86edc1048d21081bd45f3b")},
    {
    
    $set:{
    
            gender:"男",        address:"流沙河"    }}    )

db.stus.update(
    {
    
    "_id" : ObjectId("5f86edc1048d21081bd45f3b")},
    {
    
    $unset:{
    
            address:"流沙河"    }}    )

db.stus.updateMany(
    {
    
    "name" :"冉海锋"},
    {
    
    $set:{
    
        address:"高老庄"    }}    )

db.stus.find()

db.stus.update(
    {
    
    "name" :"冉海锋"},
    {
    
            $set:{
    
            address:"呵呵呵"        }    }, 
    {
    
                multi:true        }    )

db.stus.find()



9. 删除文档

  • db.collection.remove()
    • 可以根据条件来删除文档,传递条件的方式和find()一样
    • 能删除符合条件的所有文档,默认删除多个
    • 如果第二个参数传递一个true,则只会删除一个
    • 如果只传递一个{ }作为参数,则会删除集合中的所有文档
  • db.collection.deleteOne()
  • db.collection.deleteMany()
  • db.collection.drop():删除集合(如果最后一个集合没了,数据库也没了。。。)
db.stus.remove({
    
    age:28},true)
db.stus.remove({
    
    }) //性能差
db.stus.drop()
db.dropDatabase()
  • 一般数据库中的数据都不会删除,所以删除的方法很少调用,一般会在数据中添加一个字段,来表示数据是否被删除



10. 练习

//添加两万条数据的性能高,尽量少调用系统的方法
var arr=[];
for(var i=1;i<=20000;i++){
    
    
    arr.push({
    
    num:i});
}
db.user.insert(arr);
//查询numbers中num大于5000的文档
db.unmbers.find({
    
    num:{
    
    $gt:500}})

//查询numbers中num小于30的文档
db.unmbers.find({
    
    num:{
    
    $lt:500}})

//查询numbers中num大于40小于50的文档
db.numbers.find({
    
    num:{
    
    $gt:40,$lt:50}})

//查询numbers前10条的数据
db.numbers.find({
    
    num:{
    
    $lte:10}})

//limit()设置显示数据的上限
db.numbers.find().limit(10)

//查询numbers中第11条到20条的数据
	//skip()用于跳过指定数量的数据   skip( (页码-1)*每页显示的条数 ).limit(每页显示的条数)
	//MongoDB会自动调整limit()和skip()的位置
db.numbers.find().skip(10).limit(10)
db.numbers.find().limit(10).skip(10)



11. 文档间的关系

  • 一对一(one to one)

    • 夫妻

    • 在MongoDB中,可以通过内嵌文档的形式来体现出一对一的关系

      db.WifeAndHusband.insert([
          {
              
              
              wife:"黄蓉",
              husband:{
              
              
                  name:"郭靖"
              }
          },
          
          {
              
              
              wife:"潘金莲",
              husband:{
              
              
                  name:"武大郎"
              }
          }
          
      ])
      
  • 一对多(one to many)/ 多对一(many to one)

    • 一对多:父母和孩子、用户和订单、文章和评论,也可以通过内嵌文档的方式来映射一对多的关系(将1的那个属性设置为多的里面的字段)

      db.order.insert({
              
              
      	list:["watermelor"],
          user_id:ObjectId("5f87b1deda684b252c2fc7a5")
      })
      
      var user_id = db.users.findOne({
              
              username:"swk"})._id
      //查询孙悟空的订单
      db.order.find({
              
              user_id:user_id})
      
  • 多对多(many to many):分类和商品,通过内嵌文档的方式

    db.teacher.insert([
    	{name:"洪七公"},
        {name:"黄药师"},
        {name:"龟仙人"}
    ])
    
    db.stus.insert([
        {
            name:"郭靖",
            tech_ids:[
                ObjectId("5f87b4b6da684b252c2fc7a8"),
                ObjectId("5f87b4b6da684b252c2fc7a9")
            ]
        },   
        {
            name:"孙悟空",
            tech_ids:[
                ObjectId("5f87b4b6da684b252c2fc7a8"),
                ObjectId("5f87b4b6da684b252c2fc7a9"),
                ObjectId("5f87b4b6da684b252c2fc7aa")
            ]
        }
    ])
    



12. 练习

//查询工资小于1000或者大于2000的员工
db.emp.find( $or:[ {
    
    sal:{
    
    $lt:1000}},{
    
    sal:{
    
    $gt:2500}} ])

//为所有工资小于1000的增加400
db.emp.find({
    
    sal:{
    
    $lte:1000}},	{
    
    $inc:{
    
    $sal:400}})



13. sort和投影

  • find()查询文档时,默认情况是按照_id的值进行升序排列

  • sort()可以用来指定文档的排序的规则,需要传递一个属性来指定排序规则,1表示升序,-1表示降序

    db.users.find({
          
          }).sort({
          
          sale:1})
    db.users.find({
          
          }).sort({
          
          sale:1,qq:1}) //先指定sale的升序 再qq的降序
    
  • limit、skip、sort可以任意顺序的调用

  • 查询时,我们可以在第二个参数的位置来设置查询结果的投影

    db.users.find({
          
          },{
          
          sale:1})
    

猜你喜欢

转载自blog.csdn.net/lyyrhf/article/details/115469161