MongoDB学习笔记(自用)

MongoDB学习笔记(自用)

本文根据黑马程序员的课程资料与百度搜索的资料共同整理所得,仅用于学习使用,如有侵权,请联系删除

1.简介

1.1数据操作特点

  • 数据量大
  • 写入操作频繁(读写操作频繁)
  • 价值较低的数据(对业务性要求不高)

1.2使用时机

  • 应用不需要事务及复杂的join查询
  • 新应用(需求易变,数据模型不确定)
  • 需要2000-3000以上的QPS(增删改查)
  • TB级别的数据存储高可用(副本集:提供自动故障转移和数据冗余)
  • 大量的地理位置查询、文本查询

1.3介绍

  • MongoDB是一个开源、高性能、无模式的文档型数据库,是NoSQL数据库产品中的一种,是最像关系型数据库(MySQL)的非关系型数据库。

  • 它支持的数据结构非常松散,是一种类似于 JSON 的 格式叫BSON(Binary-JSON),所以它既可以存储比较复杂的数据类型,又相当的灵活。

  • MongoDB中的记录是一个文档,它是一个由字段和值对(field:value)组成的数据结构。

  • 体系结构:

MysqlMongoDB说明
tablecollection
rowdocument记录行
columnfield字段
table joins嵌入文档多表连接
  • 对象id: UUID 自动生成

  • Bson中,除了基本的JSON类型:string,integer,boolean,double,null,array和object,mongo还使用了特殊的数据类型。

  • 这些类型包括date,object id,binary data,regular expression 和code。

2.MongoDB 单机部署

2.1 windows启动服务

1.下载解压

2.启动:

预先手动建立一个目录用于存放数据文件(解压目录/data/db)

  • 默认打开方式:在bin目录打开cmd
mongod --dbpath=..\data\db
# 在启动信息中可以看到,mongoDB的默认端口是27017
# 若想要改变启动端口,可以通过–port来指定端口
  • 配置打开方式:预先在解压目录中新建 config 文件夹,在该文件夹中新建配置文件 mongod.conf ,写入如下配置
storage:
#The directory where the mongod instance stores its data.Default Value is "\data\db" on Windows.
 dbPath: D:\02_Server\DBServer\mongodb-win32-x86_64-2008plus-ssl-4.0.1\data
# 注意遵循yaml书写方式
# dbPath中P大写

启动:

mongod -f ..\config\mongod.conf 
mongod --config ..\config\mongod.conf	# 二选一即可

2.2 shell命令连接数据库

新版MongoDB不自带mongosh.exe文件,需要去官网下载MongoDB Shell

1.下载解压

2.将mongo shell的bin目录所在路径 写入到环境变量Path中

3.在已启动mongo服务的前提下,在mongo shell所在bin目录中,输入

mongosh

2.3 Compass图形化客户端连接数据库

1.下载安装

2.在已启动mongo服务的前提下,在应用程序中连接即可(注意端口号)

3. 基本常用信息

3.1 数据库操作

在 MongoDB 中,集合只有在内容插入后才会创建!

即创建集合(数据表)后要插入一个文档(记录)后集合才能被真正创建。

  • 选择/创建数据库(如果数据库不存在则自动创建)
use <dbname>
  • 查看所有的数据库
show dbs
show databases	# 二选一
  • 查看当前正在使用的数据库
db
# 若没有选择数据库,集合将默认存放在test数据库中
  • 数据库名可以是满足以下条件的任意UTF-8字符串:

    • 不能为空

    • 不得含有空格、点、$、/、\和空字符

    • 应全部小写。

    • 最多64字节。

  • 有部分数据库名被预留,具有特殊作用:

    • admin: 相当于root数据库。若一个用户可以添加这个数据库,这个用户则可自动继承所有数据库的权限。一些特殊服务器端命令也只能在这个数据库中运行(如列出所有的数据库或者关闭服务器)

    • local: 这个数据永远不会被复制,用来存储限于本地单台服务器的任意集合

    • config: 当Mongo进行分片设置时,config数据库在内部使用,用于保存分片的相关信息

  • 删除数据库

db.dropDatabase()
# 主要用以删除 已经持久化的数据库

3.2集合操作

  • 集合显式创建(直接创建,不推荐)
db.createCollection(<集合名称>)
  • 集合的命名规范:
    • 不能是空字符串
    • 不能含有空字符
    • 不能以"system."开头(为系统集合保留的前缀)
  • 集合隐式创建(通过插入文档来创建,推荐)
  • 集合删除
db.collection.drop(<集合名称>)
db.<集合名称>.drop()	# 二选一
# 若成功删除选定集合,方法返回 true,否则返回 false。

3.3 文档基本CRUD

1.增

  • 单个插入
db.collection.insert(
<document or array of documents>,
{
writeConcern: <document>,
ordered: <boolean>
}
)

db.user.insert(
{
"articleid":"1",
"content":"string",
"userid":"1",
"nickname":"cui",
"createdatetime":new Date(),
"likenum":NumberInt(10),
"state":null
}
)
  • 提示:

    • 数字默认为double类型;若要存整型,必须使用函数NumberInt(整型数字),否则取出来存在问题了
    • 插入当前日期使用 new Date()
    • 插入的数据没有指定 _id ,会自动生成主键值
    • 如果某字段没值,可以赋值为null,或不写该字段。
  • 注意:

    • 文档中的键值对是有序的
    • MongoDB的文档不能有重复的键
    • 文档的键是字符串
  • 文档键命名规范:

    • 键不能含有空字符(用以表示键的结尾)
    • . 和 $ 有特别的意义,只有特定环境下才能使用。
    • 以下划线"_"开头的键是被保留的(但并非严格要求的)。
  • 批量插入

db.collection.insertMany(
[ <document 1> , <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)

# 插入时若指定了 _id ,则主键就是该值。
# 若某条数据插入失败,将会终止插入(但已经插入成功的数据不会回滚掉)

2.删

db.<集合名称>.remove(<条件>)

db.user.remove({})	# 会将数据全部删除,慎用!
db.user.remove({_id:"1"} # 删除_id=1的记录

3.改

db.collection.update(query, update, options)

db.collection.update(
	<query>,	# 更新条件
	<update>,	# 更新文档
	{
	upsert: <boolean>,	# 为true时,没有符合的时自动添加新文档
	multi: <boolean>,
	writeConcern: <document>,
	collation: <document>,
	arrayFilters: [ <filterdocument1>, ... ],
	hint: <document|string> // Available starting in MongoDB 4.2
	}
)

# 关注前四个参数即可
# 覆盖修改
db.user.update({_id:"1"},{likenum:NumberInt(1001)})

# 局部修改
db.user.update({_id:"2"},{$set:{likenum:NumberInt(889)}})

# 批量修改
# 默认只修改第一条数据
db.user.update({userid:"1"},{$set:{nickname:"hua"}})
# 修改所有符合条件的数据
db.user.update({userid:"1"},{$set:{nickname:"nick"}},{multi:true})

# 列值增长修改(如果我们想实现对某列值在原有值的基础上进行增加或减少,可以使用 $inc 运算符来实现)
# 实现效果:点赞数每次递增1
db.user.update({_id:"3"},{$inc:{likenum:NumberInt(1)}})

4.查

  • 单个查询
db.collection.find(<query>, [projection])

db.user.find({"userid":"1"})
db.user.findOne({userid:'1003'})  # 只要一个符合要求的文档

# 投影查询(不显示所有字段,只显示指定的字段):

db.user.find({userid:"1"},{userid:1,nickname:1})
# 只显示userid、nickname、_id,因为默认会显示_id

db.user.find({userid:"1"},{userid:1,nickname:1,_id:0}) # 不会显示了
  • 查询所有
db.user.find()
db.user.find({})		# 二选一

3.4 文档的分页查询

  • 查询统计
db.collection.count(query, options)

db.user.count()	# 统计所有记录数
db.user.count({userid:"1"})	# 按条件统计记录数
  • 分页查询
db.user.find().limit(3).skip(1)
# limit()方法用于读取指定数量的数据
# skip()方法用于跳过指定数量的数据
  • 排序查询
db.user.find().sort({KEY:1})
db.user.find().sort(1)		# 二选一

# sort() 方法可以通过参数指定排序的字段
# 其中 1 为升序排列,而 -1 是用于降序排列。
  • 执行的顺序:先 sort(), 然后是 skip(),最后是显示的 limit()
  • 和命令编写顺序无关。

3.5 更多查询

  • 正则查询
db.collection.find({field:/正则表达式/})

db.user.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.user.find({userid:{$in:["3","4"]}})	
db.user.find({userid:{$nin:["3","4"]}})
  • 条件连接查询
db.user.find({$and:[{条件1},{条件2}]})
db.user.find({$or:[{条件1},{条件2}]})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值