Mongodb(非关系数据库)基础

简介

MongoDB是一个开源,高性能,无模式的文档型数据库。一个基于分布式文件存储的数据库。利于简化开发和方便扩展。

支持的数据结构非常松散,以一种类似于JSON的格式(BSON),用于存储复杂的数据类型

MongoDB记录是一个文档,由字段和值对应组成的数据结构。字段的类型是字符型,值可以为基本数据类型也可以为文档,数组,文档数组等。

主要应用于:

1,高并发读写

2,对海量数据的存储和访问

3,对数据库的高扩展和高可用

具体表现场景如:

1,社交场景,用于存储用户信息,朋友圈以及地理位置索引

2,游戏场景,游戏用户信息,用户装备,积分,升级等信息的存储和访问

3,物流 场景,订单状态的不断更新

5,直播场景,点赞互动等

特点如下:

1,,数据量大

2,写入频繁

3,数据价值不高,对事务性要求很低

体系结构和mysql对比

SQL术语/概念MongoDB术语/概念解释/说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
columnfield数据字段/域
indexindex索引
table joins表连接,MongoDB不支持
嵌入文档MongoDB通过嵌入式文档来替代多表连接
primary keyprimary key主键,MongoDB自动将_id字段设置为主键

BSON数据类型参考列表

数据类型描述例子
字符串UTF-8字符串都可表示为字符串类型的数据{"str":"str"}
对象id对象id是文档的12字节的唯一ID{"str":ObjectId()}
布尔值true or false{"str": true}
数组array{"str": ["a","b","c"]}
32位整数int不支持,默认64位浮点数
64位整数long不支持,默认64位浮点数
64位浮点型double{"str": 3.1415967}
null表示为空值{"str": null}
undefined表示为未定义类型{"str": undefined}
符号不支持
正则表达式正则{"str": /b/}
代码可包含JavaScript代码{"str": function(){/**.......*/}}
二进制数据二进制
最大值/最小值BSON中的特殊类型

Mongodb下载安装

MangoDB下载地址:Download MongoDB Community Server | MongoDB

MangoDB标准官方文档:What is MongoDB? — MongoDB Manual

手动建立数据存放文档

方式一:命令行参数方式启动服务

在bin目录中打开,输入以下命令:

mongod --dbpath=..\data\db

在启动信息中可以看到,mongodb的默认端口是27017,我们可以通过--port来指定启动端口。

方式二: 配置文件方式启动服务

在解压目录中新建config文件夹,在该文件夹中新建配置文件mongodb.cof。内容参考如下:

storage:
    dbPath: data路径

启动方式

mongodb -f ../config/mongod。conf
或
mongod --config ../config/mongod.conf

连接mongo命令

mongo
或
mongo --host=127.0.0.1 --port=27017

查看已存在的数据库

show database

退出

exit

查看帮助

mongo --help

Mangodb的默认数据库

数据库介绍
admin从权限看这属于root权限的数据库。将用户添加如这个数据库中,这个用户就会自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行
local这个数据永远不会被复制(针对集群而言),可以用来存储限于本地单台服务器的任意集合
config当Mongo用于分片设置时,config数据库在内部使用,用于保存分片相关信息

mangodb数据库命令(基本)

1,查看数据库

show dbs
或
show database

2,查看当前数据库

db

3,数据库的删除

db.dropDatabase()
用于删除已持久化的数据库

4,集合的显示创建

db.createCollection(name)
name: 为要创建的集合的名称

5,查看当前数据库中的表

show collections
or
show tables

6,删除集合

db.collection.drop
or 
db.集合名.drop
如果删除成功,则drop()方法返回true,否则返回false

MangoDB文档的操作命令

所有存储在集合中的数据都是BSON格式

1,单个文档的插入

使用insert()或save()方法向集合中插入文档,语法如下

db.collection.insert(
<document or array of documents>
    {
        writeConcern: <document>,
        ordered: <boolean>
    }
)
参数:
document: 要插入到集合中的文档或者文档数组
writeConcern: 插入的时候选择的性能级别
ordered: 是否排序。布尔型,可选。如果为真,则按顺序插入数组中的文档,如果其中一个文档出现错误,MongoDB将返回不处理数组中的其余文档。如果为假,则执行无序插入,如果其中一个文档出现错误,则继续处理数组中的主文档。在版本2.6+中默认为true
例子:
db.comment.insert({"articleid":"10000", "content":"今天天气真好啊", "userid":"1001","nickname":"Rose", "createdatetime":new Date(),"likenum":NumberInt(10),"state":null})

2,批量插入

db.collection.insertMany(
    [<document 1>, <document 2>……] 
    {
        writeConcern: <document>,
        ordered: <boolean>
    }
)
例子:
    db.collection.insertMany([
    {"id": "1", "articleid":"10000", "content":"今天天气真好啊", "userid":"1001","nickname":"Rose", "createdatetime":new Date(),"likenum":NumberInt(10),"state":null},
    {"id": "2", "articleid":"10000", "content":"今天天气真不错啊", "userid":"1001","nickname":"Rose", "createdatetime":new Date(),"likenum":NumberInt(10),"state":null}])

2,文档的查询

db.collection.find(<query>, [projection])
参数:
query: 可选。使用查询运算符指定选择筛选器。若要返回集合中的所有文档,请省略此参数或者传递空文档({})
projection:可选。指定要在与查询筛选器匹配的文档中返回的字段(投影)。若要返回匹配文档中的所有字段。请省略此参数

查询所有

db.coment.find() 这里的coment指的是具体的集合名称
或
db.comment.find([])

投影查询

指的是mysql中的select name, id等只查询具体的部分的信息。

db.coment.find({userid: "1003"}, {userid:1,nickname:1})
这里coment指的是集合名,find中的第一段相当于mysql中where后面的匹配语句。find中的第二段则相当于我们select name, id中的具体值,其中1表示显示,0表示不显示。
再例如:
查询所有数据,但只显示userid,nickname
dbcomment.find({}, {userid:1, nickname:1}) 

3,文档的更新

db.collection.update(query, update, options)
或
db.collection.update(
    <query>,
    <update>,
    {
        upsert:<boolean>,
        multi:<boolean>,
        writeConcern:<document>,
        collation:<document>,
        arrayFilters: [<filterdocument1>, ……],
        hint:<document|string>
    }
)
参数:
query: 更新的选择条件。可以使用find()方法中相同的查询选择器。类似sql更新中where后面的
update:要修改的部分。
upsert:为true则在没有与查询调教匹配的文档时创建新文档。默认为false
multi:为true则表示更新符合查询条件的多个文档。为false则只更新一个文档。默认为false
writeConcern:表示写问题的文档。抛出异常级别

覆盖的修改

db.comment.update({_id:"1"}, {likenum:NumberInt(1001)})
这里comment指的是集合
update中第一段表示query查询的条件
update中第二段表示update要更改为的部分。也就是会替换原BSON的内容

局部修改

为了实现这个操作需要借助$set来实现
如:
db.comment.update({_id:"1"}, {$set:{likenum:NumberInt(889)}})

批量的修改

更新符合条件的所有文档

// 默认只修改第一条数据
db.comment.update({userid:"1"}, {$set:{likenum:NumberInt(889)}})
// 修改所有符合条件的数据
db.comment.update({userid:"1"}, {$set:{likenum:NumberInt(889)}}, {multi:true})

增长或删除式的修改

如果我们需要对某列的值在原有的基础上进行增加或者减少,可以使用$inc运行符进行实现

db.comment.update({_id:"3"}, {$inc:{likenum:NumberInt(1)}})

4,删除文档

语法
db.集合名称.remove(条件)
全部删除
db.comment.remove({})
根据调教删除
db.comment.remove(_id:"1")

5,文档的统计,分页以及排序查询

统计查询,统计使用count()方法

db.collection.count(query, options)
参数:
query: 查询的选择条件
options: 可选,用于修改计数的额外选项。
例如:
计算所有文档
db.comment.count()
根基条件计算统计数
db.comment.count({userid: "1003"})

分页查询,我们可以使用limit()方法来指定分页查询,使用skip()方法来跳过指定的数据

基本语法
db.集合名称.find(条件).limit(pageSize).skip(offset)
例如:
查询第一页
db,comment.find().skip(0).limit(2)
查询第二页
db.comment.find().skip(2).limit(2)

排序查询

我们使用sort()方法进行对数据的排序,sort()方法可以通过指定排序的字段,并使用1和-1来指定排序的方式。其中1为升序排列,而-1是用于降序排列。

基本语法
db.集合名称.find().sort({KEY:1})
或
db.集合名称.find().sort(排序方式)

6,更多的模糊查询

正则查询

基本语法
db.集合名称.find()({字段:/正则表达式/})
例如:
查询所有包含开水的文档
db.comment.find({content:/开水/})

比较查询

通用<,<=,>,>=

基本语法
db.集合名称.find({field : {$gt: value}}) // 大于
db.集合名称.find({field : {$lt: value}}) // 小于
db.集合名称.find({field : {$gte: value}}) // 大于等于
db.集合名称.find({field : {$lte: value}}) // 小于等于
db.集合名称.find({field : {$ne: value}}) // 不等于
例如:
db.comment.find({_id:{$gt:NumberInt(2)}})

包含查询

包含使用$in操作符

基本语法
db.集合名称.find({field: {$in:["值1", "值2"]}})
例如:
db.comment.find({user:{$in:["1003","1004"]}})

条件查询

如果我们需要查询同时满足两个以上的条件,需要使用$and操作符进行关联。相当于sql中的and.

如果是或的关系,我们需使用$or进行关联

基本语法
db.集合名称.find({$and:[{条件1}, {条件2}]})
例如:
db.comment.find({$adnd:[{ikenum:{$gte:NumberInt(500)}, {ikenum:{$lt:NumberInt(700)}}}])
$or同$and一致
  • 25
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值