欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mongodb数据库

程序员文章站 2022-03-09 08:13:24
...

Mongodb数据库

一、什么是数据库

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库


  • 关系型数据库(sql):Access mySql SqlServer oracle db2等。
  • 非关系型数据库( NoSql ): MongoDB,Redis,HBase,CouchDB等。

Mongodb数据库
Mongodb数据库

非关系型数据库数据条目其实是bson。bson 是 json 的超集,比如 json 中没法储存二进制类型,而 bson 拓展了类型,提供了二进制支持。mongodb 中存储的一条条记录都可以用 bson 来表示。所以你也可以认为,mongodb 是个存 bson 数据的数据库。

二、NoSQL简介

  NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关型数据库的数据库管理系统的统称。
  NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。

3.MongoDB简介

  • MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

分布式算法指的是将一个大型的任务进行分解,将每一个小任务的执行结果组合起来,返回一个整体
好处: 给其他任务提供了可执行的机会

  • MongoDB 是非关系型数据库当中功能最丰富,最像关系型数据库的。

三、MongoDB优点

  • 面向集合存储,易存储对象类型的数据。
  • 模式*。
  • 支持动态查询。
  • 支持完全索引,包含内部对象。
  • 支持查询。
  • 支持复制和故障恢复。
  • 使用高效的二进制数据存储,包括大型对象(如视频等)。
  • 自动处理碎片,以支持云计算层次的扩展性
  • 支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
  • 文件存储格式为BSON(一种JSON的扩展)

四、BSON

  • BSON是一种类似json的二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和BinData类型。

  • BSON可以做为网络数据交换的一种存储形式,这个有点类似于Google的ProtocolBuffer,但是BSON是一种schema【骨架】-less的存储形式,它的优点是灵活性高,但它的缺点是空间利用率不是很理想。

  • BSON有三个特点:轻量性、可遍历性、高效性。

五、非关系型数据库与关系型数据库区别

非关系型数据库的优势:

  1. 性能

NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高。

  1. 可扩展性

同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。

关系型数据库的优势:

  1. 复杂查询

可以用SQL语句方便的在多个表之间做非常复杂的数据查询。

  1. 事务支持

使得对于安全性能很高的数据访问要求得以实现。

总结:
- 数据库功能是用来存储数据的。
- 数据库分为关系系数据库和非关系型数据库(nosql)
- 关系型数据库是由表和表之间的关系组成的,nosql是由集合组成的,集合下面是很多的文档
- 非关系型数据库文件存储格式为BSON(一种JSON的扩展)。

六、MongoDB

管理员身份运行cmd

1.启动MongoDB

Mongodb数据库
Mongodb数据库
Mongodb数据库

2.将MongoDB安装为windows服务

> mongod  --storageEngine mmapv1 --dbpath "d:\mongodb\db" --logpath "d:\mongodb\log\MongoDB.log" --install --serviceName "MongoDB"

启动mongodb服务

> NET START MongoDB

关闭服务和删除进程

> net stop MongoDB

3.MongoDB基础使用

  • 查看帮助 >help
> help
        db.help()                    help on db methods
        db.mycoll.help()             help on collection methods
        sh.help()                    sharding helpers
        rs.help()                    replica set helpers
        help admin                   administrative help
        help connect                 connecting to a db help
        help keys                    key shortcuts
        help misc                    misc things to know
        help mr                      mapreduce

        show dbs                     show database names
        show collections             show collections in current database
        show users                   show users in current database
        show profile                 show most recent system.profile entries with time >= 1ms
        show logs                    show the accessible logger names
        show log [name]              prints out the last segment of log in memory, 'global' is default
        use <db_name>                set current database
        db.foo.find()                list objects in collection foo
        db.foo.find( { a : 1 } )     list objects in foo where a == 1
        it                           result of the last line evaluated; use to further iterate
        DBQuery.shellBatchSize = x   set default number of items to display on shell
        exit                         quit the mongo shell
  • 显示数据库列表 > show dbs
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
  • 创建数据库 > use dbname
> use 1908
switched to db 1908
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

如果数据库不存在,则创建数据库dbname,否则切换到指定数据库dbname。创建的数据库并不在数据库的列表中,要显示它,我们需要向数据库dbname插入一些数据

> db.webs.save({name:"wang"})
WriteResult({ "nInserted" : 1 })
> show dbs
1908    0.000GB
admin   0.000GB
config  0.000GB
local   0.000GB
  • 显示数据库中的集合 show collections
> show collections
students
webs
3.1 增加数据
  • db.webs.save({“name”:“老李”})
> db.students.save({age:"20"})
WriteResult({ "nInserted" : 1 })
  • db.webs.insert({“name”:“ghost”, “age”:10})
> db.student.insert({name:"lisi"})
WriteResult({ "nInserted" : 1 })
  • db.webs.insert({name:‘ssss’,msg:{sex:‘man’,age:10}}) 特殊数据条目包含对象
    注:查询这个对象中的数据:db.webs.find({‘msg.age’:10})
> db.webs.insert({name:'ssss',sex:'man',obj:{s:'wqehk',g:10}})
WriteResult({ "nInserted" : 1 })
> db.webs.find({'obj.g':10})
{ "_id" : ObjectId("5da4573877f482015bd3759f"), "name" : "ssss", "sex" : "man", "obj" : { "s" : "wqehk", "g" : 10 } }

如果没有web这个集合,mongodb会自动创建

save()和insert()也存在着些许区别:若新增的数据主键已经存在,insert()会不做操作并提示错误,而save()则更改原来的内容为新内容。

Mongodb数据库

_id是主键,主键是每条数据的唯一标识,不能重复,就像身份证是每个人唯一的编号一样.


3.2 删除数据
  1. 删除文档

    • db.users.remove({}) 删除users集合下所有数据
    > db.students.remove({})
    WriteResult({ "nRemoved" : 2 })
    
    • db.users.remove({“name”: “lecaf”}) 删除users集合下name=”lecaf”的数据
    > db.web.remove({name:'lisl'})
    WriteResult({ "nRemoved" : 1 })
    
  2. 删除集合

    • db.users.drop()或db.runCommand({“drop”:“users”}) 删除集合users
    > db.students.drop()
    true
    > db.runCommand({"drop":"student"})
    { "nIndexesWas" : 1, "ns" : "1908.student", "ok" : 1 }
    
  3. 删除数据库

    • db.runCommand({“dropDatabase”: 1}) 删除当前数据库,注意 此处的1没加双引号。
    > db.runCommand({"drop":"student"})
    { "nIndexesWas" : 1, "ns" : "1908.student", "ok" : 1 }
    

3.3 查找数据
  • db.users.find() 查找users集合中所有数据
> db.webs.find()
{ "_id" : ObjectId("5da43d8777f482015bd37599"), "name" : "zhangsan", "age" : "18" }
{ "_id" : ObjectId("5da43d9b77f482015bd3759a"), "name" : "lisi", "age" : "20" }
{ "_id" : ObjectId("5da43db377f482015bd3759b"), "name" : "wangwu", "age" : "22" }
  • db.users.findOne() 查找users集合中的第一条数据
> db.webs.findOne()
{
        "_id" : ObjectId("5da43d8777f482015bd37599"),
        "name" : "zhangsan",
        "age" : "18"
}
  • db.users.find().pretty() 格式化查询到的数据
> db.webs.find().pretty()
{
        "_id" : ObjectId("5da43d8777f482015bd37599"),
        "name" : "zhangsan",
        "age" : "18"
}
{
        "_id" : ObjectId("5da43d9b77f482015bd3759a"),
        "name" : "lisi",
        "age" : "20"
}
{
        "_id" : ObjectId("5da43db377f482015bd3759b"),
        "name" : "wangwu",
        "age" : "22"
}

排序:

  • >db.webs.find().sort({age:-1}) 数据从大到小排序,{age:1}则正序
> db.webs.find().sort({age:-1})
{ "_id" : ObjectId("5da445e077f482015bd3759e"), "name" : "zhangsan", "age" : 30 }
{ "_id" : ObjectId("5da445bc77f482015bd3759d"), "name" : "zhangsan", "age" : 24 }
{ "_id" : ObjectId("5da43f5277f482015bd3759c"), "name" : "zhaoliu", "age" : 22 }
{ "_id" : ObjectId("5da43db377f482015bd3759b"), "name" : "wangwu", "age" : 20 }
{ "_id" : ObjectId("5da43d9b77f482015bd3759a"), "name" : "lisi", "age" : 18 }
{ "_id" : ObjectId("5da43d8777f482015bd37599"), "name" : "zhangsan", "age" : 16 }

条件查询:

  • >db.webs.find({age:{$gt:10}}) 查询age大于10的数据
  • >db.webs.find({age:{$gte:10}}) 查询age大于等于10的数据
  • >db.webs.find({age:{$lt:10}}) 查询age小于10的数据
  • >db.webs.find({age:{$lte:10}}) 查询age小于等于10的数据
  • >db.webs.find({age:{$ne:10}}) 查询age不等于10的数据
  • >db.webs.find({age:{gt:10,gt:10,lt:20}}) 查询age大于10小于20的数据

当value值是数字字符串

> db.webs.find({age:{$gt:'20'}})
{ "_id" : ObjectId("5da43db377f482015bd3759b"), "name" : "wangwu", "age" : "22" }
{ "_id" : ObjectId("5da43f5277f482015bd3759c"), "name" : "zhaoliu", "age" : "24" }
{ "_id" : ObjectId("5da445bc77f482015bd3759d"), "name" : "zhangsan", "age" : "30" }
{ "_id" : ObjectId("5da445e077f482015bd3759e"), "name" : "zhangsan", "age" : "60" }
> db.webs.find({age:{$ne:'20'}})
{ "_id" : ObjectId("5da43d8777f482015bd37599"), "name" : "zhangsan", "age" : "18" }
{ "_id" : ObjectId("5da43db377f482015bd3759b"), "name" : "wangwu", "age" : "22" }
{ "_id" : ObjectId("5da43f5277f482015bd3759c"), "name" : "zhaoliu", "age" : "24" }
{ "_id" : ObjectId("5da445bc77f482015bd3759d"), "name" : "zhangsan", "age" : "30" }
{ "_id" : ObjectId("5da445e077f482015bd3759e"), "name" : "zhangsan", "age" : "60" }
> db.webs,find({age:{"$lt":"20","$gt":"18"}})
2019-10-14T18:40:37.113+0800 E  QUERY    [js] ReferenceError: find is not defined :
@(shell):1:9
  • >db.webs.find({age:{$mod:[10,0]}}) 查询age%10==0的数据
> db.webs.find({age:{$mod:[10,2]}})
{ "_id" : ObjectId("5da43f5277f482015bd3759c"), "name" : "zhaoliu", "age" : 22 }
> db.webs.find({age:{$mod:[10,0]}})
{ "_id" : ObjectId("5da43db377f482015bd3759b"), "name" : "wangwu", "age" : 20 }
{ "_id" : ObjectId("5da445e077f482015bd3759e"), "name" : "zhangsan", "age" : 30 }
  • >db.webs.find({age:{$in:[1,2,3]}}) 查询age属于[1,2,3]中任何一个的数据
> db.webs.find({age:{$in:[16,18,20]}})
{ "_id" : ObjectId("5da43d8777f482015bd37599"), "name" : "zhangsan", "age" : 16 }
{ "_id" : ObjectId("5da43d9b77f482015bd3759a"), "name" : "lisi", "age" : 18 }
{ "_id" : ObjectId("5da43db377f482015bd3759b"), "name" : "wangwu", "age" : 20 }
  • >db.webs.find({age:{$nin:[1,2,3]}}) 查询age不属于[1,2,3]中任何一个的数据
> db.webs.find({age:{$nin:[20]}})
{ "_id" : ObjectId("5da43d8777f482015bd37599"), "name" : "zhangsan", "age" : 16 }
{ "_id" : ObjectId("5da43d9b77f482015bd3759a"), "name" : "lisi", "age" : 18 }
{ "_id" : ObjectId("5da43f5277f482015bd3759c"), "name" : "zhaoliu", "age" : 22 }
{ "_id" : ObjectId("5da445bc77f482015bd3759d"), "name" : "zhangsan", "age" : 24 }
{ "_id" : ObjectId("5da445e077f482015bd3759e"), "name" : "zhangsan", "age" : 30 }
  • >db.webs.find({age:{$size:2}) 查询age是数组且大小为2的数据

  • >db.webs.find({age:{$exists:true}}) 查询包含age字段的数据

> db.webs.find({age:{$exists:true}})
{ "_id" : ObjectId("5da43d8777f482015bd37599"), "name" : "zhangsan", "age" : 16 }
{ "_id" : ObjectId("5da43d9b77f482015bd3759a"), "name" : "lisi", "age" : 18 }
{ "_id" : ObjectId("5da43db377f482015bd3759b"), "name" : "wangwu", "age" : 20 }
{ "_id" : ObjectId("5da43f5277f482015bd3759c"), "name" : "zhaoliu", "age" : 22 }
{ "_id" : ObjectId("5da445bc77f482015bd3759d"), "name" : "zhangsan", "age" : 24 }
{ "_id" : ObjectId("5da445e077f482015bd3759e"), "name" : "zhangsan", "age" : 30 }
  • >db.webs.find({age:{$exists:false}}) 查询不包含age字段的数据
> db.webs.find({tel:{$exists:false}})
{ "_id" : ObjectId("5da43d8777f482015bd37599"), "name" : "zhangsan", "age" : 16 }
{ "_id" : ObjectId("5da43d9b77f482015bd3759a"), "name" : "lisi", "age" : 18 }
{ "_id" : ObjectId("5da43db377f482015bd3759b"), "name" : "wangwu", "age" : 20 }
{ "_id" : ObjectId("5da43f5277f482015bd3759c"), "name" : "zhaoliu", "age" : 22 }
{ "_id" : ObjectId("5da445bc77f482015bd3759d"), "name" : "zhangsan", "age" : 24 }
{ "_id" : ObjectId("5da445e077f482015bd3759e"), "name" : "zhangsan", "age" : 30 }
  • >db.webs.find({$or:[{age:10},{name:‘zhangsan’}]}}) 查询符合两个条件中任意一个的数据
> db.webs.find({$or:[{age:16},{age:20}]})
{ "_id" : ObjectId("5da43d8777f482015bd37599"), "name" : "zhangsan", "age" : 16 }
{ "_id" : ObjectId("5da43db377f482015bd3759b"), "name" : "wangwu", "age" : 20 }

筛选:

  • >db.webs.find().limit(n) 筛选第n个数据以前的所有数据(包括n),n为0或不写都是没有约束
> db.webs.find().limit(0)
{ "_id" : ObjectId("5da43d8777f482015bd37599"), "name" : "zhangsan", "age" : "18" }
{ "_id" : ObjectId("5da43d9b77f482015bd3759a"), "name" : "lisi", "age" : "20" }
{ "_id" : ObjectId("5da43db377f482015bd3759b"), "name" : "wangwu", "age" : "22" }
{ "_id" : ObjectId("5da43f5277f482015bd3759c"), "name" : "zhaoliu", "age" : "24" }
> db.webs.find().limit(2)
{ "_id" : ObjectId("5da43d8777f482015bd37599"), "name" : "zhangsan", "age" : "18" }
{ "_id" : ObjectId("5da43d9b77f482015bd3759a"), "name" : "lisi", "age" : "20" }
  • >db.webs.find().limit(10).sort({age:-1}) 排序优先级高,先执行倒序排序,在筛选前十个数据
> db.webs.find().limit(3).sort({age:-1})
{ "_id" : ObjectId("5da445e077f482015bd3759e"), "name" : "zhangsan", "age" : 30 }
{ "_id" : ObjectId("5da445bc77f482015bd3759d"), "name" : "zhangsan", "age" : 24 }
{ "_id" : ObjectId("5da43f5277f482015bd3759c"), "name" : "zhaoliu", "age" : 22 }
  • >db.webs.find().skip(n) 获取跳过前n个数据之后的数据
> db.webs.find().skip(5)
{ "_id" : ObjectId("5da445e077f482015bd3759e"), "name" : "zhangsan", "age" : 30 }
{ "_id" : ObjectId("5da4573877f482015bd3759f"), "name" : "ssss", "sex" : "man", "obj" : { "s" : "wqehk", "g" : 10 } }
  • >db.webs.find().count() 返回结果集的条数
  • >db.webs.find().skip(5).limit(5).count(true) 在加入skip()和limit()这两个操作时,要获得实际返回的结果数,需要一个参数true,否则返回的是符合查询条件的结果总数
> db.webs.find().count()
7
> db.webs.find().limit(3).count(true)
3
  • >db.webs.find({name:‘zhangsan’},{age:1,_id:0}) 查找到数据部分显示
> db.webs.find({name:'zhangsan'},{age:1,_id:0})
{ "age" : 30 }
{ "age" : 30 }
{ "age" : 30 }

模糊查询:

  • >db.webs.find({name:/zhang/}) 查询字段name中包含zhang的数据
> db.webs.find({name:/san/})
{ "_id" : ObjectId("5da43d8777f482015bd37599"), "name" : "zhangsan", "age" : 16 }
{ "_id" : ObjectId("5da445bc77f482015bd3759d"), "name" : "zhangsan", "age" : 24 }
{ "_id" : ObjectId("5da445e077f482015bd3759e"), "name" : "zhangsan", "age" : 30 }

3.4 修改数据
  • db.web.update({“name”:“a1”}, {$set: {sex:”women”}},true,true) 修改name=a1的数据为sex=1,第一个参数是查找条件,第二个参数是修改内容,主键不能修改,第三个参数表示匹配所有符合条件的数据,第四个参数表示修改所有匹配到的数据如图
> db.webs.update({name:'lisi'},{$set:{age:18}},true,true)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Mongodb数据库