文章目录
1、MongoDB介绍
1.1介绍
MongoDB是一个开源、高性能、无模式的文档型数据库,当初的设计就是用于简化开发和方便扩展,是NoSQL数据库产品中的一种。是最像关系型数据库(MySQL)的非关系型数据库。它支持的数据结构非常松散,是一种类似于 JSON 的 格式叫BSON,所以它既可以存储比较复杂的数据类型,又相当的灵活。
MongoDB中的记录是一个文档,它是一个由字段和值对(fifield:value)组成的数据结构。MongoDB文档类似于JSON对象,即一个文档认为就是一个对象。字段的数据类型是字符型,它的值除了使用基本的一些类型外,还可以包括其他文档、普通数组和文档数组。
1.2 应用场景
1)社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能。
2)游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、高效率存储和访问。
3)物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。
4)物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析。
5)视频直播,使用 MongoDB 存储用户信息、点赞互动信息等。
这些应用场景中,数据操作方面的共同特点是:数据量大、写入操作频繁(读写都很频繁)、价值较低的数据,对事务性要求不高对于这样的数据,我们更适合使用MongoDB来实现数据的存储。
2、常用命令
2.1 数据库操作
show dbs # 显示所有数据库
show collections # 显示集合
use db_name # 使用数据库
db.dropDatabase() # 删除当前数据库
db.createCollection("name") # 创建集合
db.collection.drop() # 删除当前集合
db.name.drop() # 删除名为name的集合
2.2 文档插入
db.comment.insert( # 单条数据插入,如果comment集合不存在则创建
{
"articleid": "100000",
"content": "今天天气真好",
"userid": "1001",
"nickname": "Rose",
"createdatetime": newDate(),
"likenum": NumberInt(10),
"state": null
}
)
db.comment.insertMany([ # 批量插入
{
"_id":"1",
"articleid":"100001",
"content":"我们不应该把清晨浪费在手机上,健康很重要,一杯温水幸福你我 他。",
"userid":"1002",
"nickname":"相忘于江湖",
"createdatetime":new Date("2019-08- 05T22:08:15.522Z"),
"likenum":NumberInt(1000),"state":"1"
},{
"_id":"2",
"articleid":"100001",
"content":"我夏天空腹喝凉开水,冬天喝温开水",
"userid":"1005",
"nickname":"伊人憔 悴",
"createdatetime":new Date("2019-08-05T23:58:51.485Z"),
"likenum":NumberInt(888),
"state":"1"
},{
"_id":"3",
"articleid":"100001",
"content":"我一直喝凉开水,冬天夏天都喝。",
"userid":"1004",
"nickname":"杰克船 长",
"createdatetime":new Date("2019-08-06T01:05:06.321Z"),
"likenum":NumberInt(666),"state":"1"
},{
"_id":"4",
"articleid":"100001",
"content":"专家说不能空腹吃饭,影响健康。",
"userid":"1003",
"nickname":"凯 撒",
"createdatetime":new Date("2019-08-06T08:18:35.288Z"),
"likenum":NumberInt(2000),"state":"1"
},{
"_id":"5",
"articleid":"100001",
"content":"研究表明,刚烧开的水千万不能喝,因为烫 嘴。",
"userid":"1003",
"nickname":"凯撒",
"createdatetime":new Date("2019-08- 06T11:01:02.521Z"),
"likenum":NumberInt(3000),
"state":"1"
}
]);
2.3 文档查询
db.comment.find() # 查询comment集合里的所有内容
db.comment.find({},{userid:1,nickname:1}) # 查询所有数据,但只显示 _id、userid、nickname
# 条件查询
db.comment.find({userid:'1003'}) # 查询userid为1003的内容
db.comment.find({content:/^专家/}) # 正则表达式,要查询评论的内容中以“专家”开头记录
db.comment.find({likenum:{$gt:NumberInt(700)}}) # 查询评论点赞数量大于700的记录
db.comment.find({userid:{$in:["1003","1004"]}}) # 查询评论的集合中userid字段包含1003或1004的文档
db.comment.find({userid:{$nin:["1003","1004"]}}) # 不包含1003和1004的文档
db.comment.find().limit(3) # 返回Top3数据,默认限制20条
db.comment.find().skip(3).limit(3) # 跳过前3条数据
db.comment.find().sort({userid:-1,likenum:1}) # 对userid降序排列,并对访问量进行升序排列
db.comment.count({userid:"1003"}) # 查询userid为1003的条数
2.4 文档修改
db.comment.update({_id:"1"},{likenum:NumberInt(1001)}) # 想修改_id为1的记录(覆盖式修改)
db.comment.update({_id:"2"},{$set:{likenum:NumberInt(889)}}) # 局部修改,只修改likenum字段
db.comment.update({userid:"1003"},{$set:{nickname:"凯撒大帝"}},{multi:true}) # 修改所有符合条件的数据
2.5 删除文档
db.comment.remove({}) # 删除文档中的所有数据
db.comment.remove({_id:"1"}) # 删除文档中_id为1的记录
3、MongoDB的索引
3.1 单字段索引
MongoDB支持在文档的单个字段上创建用户定义的升序/降序索引,称为单字段索引(Single Field Index)。对于单个字段索引和排序操作,索引键的排序顺序(即升序或降序)并不重要,因为MongoDB可以在任何方向上遍历索引。
3.2 复合索引
MongoDB还支持多个字段的用户定义索引,即复合索引(Compound Index)。复合索引中列出的字段顺序具有重要意义。例如,如果复合索引由 { userid: 1, score: -1 } 组成,则索引首先按userid正序排序,然后在每个userid的值内,再在按score倒序排序。
3.3 其他索引
-
地理空间索引(Geospatial Index)
为了支持对地理空间坐标数据的有效查询,MongoDB提供了两种特殊的索引:返回结果时使用平面几何的二维索引和返回结果时使用球面几何的二维球面索引。
-
文本索引(Text Indexes)
MongoDB提供了一种文本索引类型,支持在集合中搜索字符串内容。这些文本索引不存储特定于语言的停止词(例如“the”、“a”、“or”),而将集合中的词作为词干,只存储根词。
-
哈希索引(Hashed Indexes)
为了支持基于散列的分片,MongoDB提供了散列索引类型,它对字段值的散列进行索引。这些索引在其范围内的值分布更加随机,但只支持相等匹配,不支持基于范围的查询。
3.4 索引操作命令
db.comment.getIndexes() # 查看索引
db.comment.dropIndex({userid:1}) # 删除comment集合中userid字段上的升序索引
db.comment.find({userid:"1003"}).explain() # 查看根据userid查询数据的情况
db.comment.createIndex({userid:1}) # 对userid字段建立单字段索引
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
db.comment.createIndex({userid:1,nickname:-1}) # 对userid和nickname同时建立复合(Compound)索引
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 2,
"numIndexesAfter" : 3,
"ok" : 1
}