mongodb入门练习

此处只是为了初学者提供mongodb的入门学习

3.基本命令

3.1案例需求

存放文章评论的数据存放在MongoDB中,数据结构如下

数据库:articledb

专栏文章评论comment
字段名称字段含义字段类型备注
_ididObject或StringMongo的主键字段
articleid文章IDString
content评论内容String
userid评论人idString
nickname评论人昵称String
createdatetime评论的日期时间Date
likenum点赞数int32
replynum回复数int32
state状态String0:不可见;1可见;
parentid上级IDString如果为0表示文章的顶级评论

3.2数据库操作

3.2.1选择和创建数据库

选择和创建数据库的语法格式:

use 数据库名称

如果数据库不存在则自动创建,例如,以下语句创建articledb数据库

use articledb

查看有权限查看的所有数据库的命令

show dbs
或
show databases

显示的数据库(集合)都是在硬盘上已经存储的才会显示,刚开始创建的一个空的数据库(集合),这个空的数据库(集合)是在内存中,只有在插入一个文档才会真的写进硬盘了。

另外:

数据库名可以是满足一下条件的任意UTF-8字符串

  • 不能是空的字符串
  • 不得含有 空格、 .、 $、/、\0(这些特殊字符)
  • 应全小写
  • 最多64个字节

有一些数据库名是保留的,可以直接访问这些特殊作用的数据库

  • admin:从权限的角度来看,这是“root”数据库。要是将一个用户添加到这个数据库,这个用户自动集成左右数据库的权限。一些特定的服务器端的命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器
  • local:这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
  • config:当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。

3.2.2数据库的删除

MongoDB删除数据库的语法格式如下:

db.dropdatabase()

主要用来删除已经持久化的数据库

3.3集合操作

3.3.1集合的显示创建

基本语法格式

db.createCollection(name)

  • name:要创建的集合名称

例如:我要创建一个名为myCollection的普通集合

db.createCollection(“myCollection”)

查看当前库的表

show table
或
show collections

集合的命名规范

  • 集合名不能是空字符串“”。
  • 集合名不能含有\0字符(空字符),这个字符表示集合名的结尾
  • 集合名不能以“system.”开头,这是为系统集合保留的前缀

3.3.2集合的隐式创建

当插入某个集合的文档的时候,该集合不存在,就会自动创建

3.3.3集合的删除

集合删除语法的格式如下:

db.collection.drop()

例如:

删除myCollection的集合

db.myCollection().drop()

3.4文档的CRUD的操作

文档(document)的数据结构基本和JSON一样

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

3.4.1文档的插入

(1)单个文档的插入

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

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

参数:

ParameterTypeDescription
documentdocument or array要插入打集合中的文档或文档数组。(JSON格式)
writeConcerndocument
orderedboolean可选。如果为真,则按顺序插入数组中的文档,如果其中一个文档出现错误,MongDB将返回而不处理数组中的其他文档。如果为假,则执行无序插入,如果其中一个文档出现错误,而继续处理数组中的其余文档。版本2.6后默认为true

示例

要先comment的集合(表)插入一条数据

db.comment.insert(
{"articleid":"1000","content":"今天天气还行,有太阳","userid":"1001","nickname":"kala","createdatetime":new Date(),"likenum":NumberInt(10),"state":null}
)

提示:

  1. mongo中的数字,默认的是double类型,如果要存整形,必须要用NumberInt(整型数字),否则取出来就会有问题
  2. 插入当前日期是new Date()
  3. 插入的键值没有_id,会自动生成
  4. 如果某字段没有值,可以写null,或者不写

注意:

  1. 文档的键/值对是有序的。
  2. 文档中的值不仅可以是双引号的字符床,还可以是其他集中数据类型(甚至是真个嵌入文档)
  3. MongDB区分类型和大小写
  4. MongDB的文档不能有重复的键
  5. 文档的键是字符串。除了极少数情况外,键可以使用任意utf-8字符

文档键命名规范

  • 键不能含有\0空字符。这个字符用来表示键的结尾
  • .和$有特别的意义,只有在特定的情况下才能使用
  • 以下划线“_”开头的键是保留的(不是严格要求)

(2)批量插入

语法:

db.collection.insertMany(
	<document or array of documents>,
	{
		writeConcern:<document>,
		ordered:<boolean>
	}
)

示例:

db.comment.insertMany([
	{"_id":"1","articleid":"1001","content":"我们不应该把清晨浪费在手机上,健康很重要,一杯温水健康你我。","userid":"100","nickname":"江湖","createdatetime":new Date(),"likenum":NumberInt(1000),"state":"1"},
	{"_id":"2","articleid":"1002","content":"早上写代码,今天就不会浪费时间","userid":"101","nickname":"李均","createdatetime":new Date(),"likenum":NumberInt(999),"state":"1"},
	{"_id":"3","articleid":"1002","content":"早上别赖床,早点起来,今天的时间就很多了。","userid":"101","nickname":"李均","createdatetime":new Date(),"likenum":NumberInt(888),"state":"1"},
	{"_id":"4","articleid":"1003","content":"我的铠爹开大无敌,一刀秒脆皮。","userid":"102","nickname":"江湖","createdatetime":new Date("2020-02-24T01:23:23.845Z"),"likenum":NumberInt(666),"state":"1"},
])

提示:

插入是如果指定_id,则该键就是主键

如果某条数据插入失败,将终止插入,但已经插入成功的数据不会回滚了。

因为批量插入由于数据较多容易出现失败,因此,可以使用try catch进行异常捕捉处理,测试的时候可以不处理。

try{
db.comment.insertMany([
	{"_id":"1","articleid":"1001","content":"我们不应该把清晨浪费在手机上,健康很重要,一杯温水健康你我。","userid":"100","nickname":"江湖","createdatetime":new Date(),"likenum":NumberInt(1000),"state":"1"},
	{"_id":"2","articleid":"1002","content":"早上写代码,今天就不会浪费时间","userid":"101","nickname":"李均","createdatetime":new Date(),"likenum":NumberInt(999),"state":"1"},
	{"_id":"3","articleid":"1002","content":"早上别赖床,早点起来,今天的时间就很多了。","userid":"101","nickname":"李均","createdatetime":new Date(),"likenum":NumberInt(888),"state":"1"},
	{"_id":"4","articleid":"1003","content":"我的铠爹开大无敌,一刀秒脆皮。","userid":"102","nickname":"江湖","createdatetime":new Date(),"likenum":NumberInt(666),"state":"1"},
]);
}catch(e){
	print(e);
}

3.4.2文档的基本查询

查询数据的基本格式如下:

db.collection.find(<query>,[projection])

参数:

ParameterTypeDescription
querydocument可选。使用查询运算符指定筛选器。若要返回集合中的所有文档,请省略此参数或者传递空文旦{}
projectiondocument可选。指定要在查询筛选器匹配的文档返回的字段(投影)。若要返回匹配文档中的所有字段,请省略此参数

示例:

(1)如果我们要查询comment集合中的所有文档

db.comment.find()
或
db.comment.find({})

这里你会发现每条文档中都有一个叫_id的字段,这个相当于原本关系型数据库的主键,当你在插入文档记录时没有指定该字段,MongDB会自动创建,其类型是ObjectID类型。

如果我们在插入文档记录时指定该字段也可以,其类型可以是ObjectID类型,也可以是MongDB支持的其他类型。

如果我想按一定条件查询,比如我想查询(comment集合)表中的(userid为101)的文档记录

db.comment.find({userid:"101"})

如果指定查询条件返回有多个记录,若我们只想返回一条记录

db.comment.findOne({userid:"101"})

(2)投影查询(projection query)

如果要查询结果返回某些字段,则需要使用投影查询(不显示所有字段,只显示指定字段)

如:在comment集合中查询结果只显示_id、userid、nickname

db.comment.find({userid:"101"},{userid:1,nickname:1})

默认_id会显示

如:查询结果只显示userid、nickname,不显示_id

db.comment.find({userid:"101"},{userid:1,nickname:1,_id:0})

再例如:查询所有数据,但是每行数据只显示_id、userid、nickname

db.comment.find({},{userid:1,nickname:1})

3.4.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>
	}
)

参数:

ParameterTypeDescription
querydocument更新的选择条件。可以使用与find()方法中相同的查询选择器,类似sql的update查询内where后面。
updatedocument或pipeline要应用的修改。该值可以是:包含更新运算符表达式的文档,或仅包含:对的替换文档。或在Mongdb4.2中启动聚合管道。管道可以有以下阶段组成: a d d F i e l d s 及 其 别 名 addFields及其别名 addFieldsset p r o j e c t 及 其 别 名 project及其别名 projectunset r e p l c a e r o o t 及 其 别 名 replcaeroot及其别名 replcaerootreplcaeWith。换句话说:它就是updata的对象和一些更新操作符(如 , , ,inc …)等,也可以理解为sql update 查询内set后面的值。
upsertboolean可选。如果设置为true,则在没有与查询条件匹配的文档时创建新的文档。默认值是false,如果找不到匹配项,则不会插入新文档。
multiboolean可选。如果设置为true,则更新符合查询条件的多个文档。如果设置为false,则更新一个文档,默认值为false。
writeConcerndocument可选。表示写问题的文档。抛出异常的级别。
collationdocument可选。指定要操作的校对规则。
arrayFiltersarray可选。一个筛选文档数组,用于确定要为数组字段上的更新操作修改哪些数组元素。
hintDocument 或String可选。指定用于支持查询谓词的索引的文档或字符串。如果索引不存在,则说明操作错误。

提示

主要关注前面四个参数即可。

示例:

(1)覆盖修改

如果我们想修改 _id为1的记录,点赞量为1001,输入以下语句:

db.comment.update({_id:"1"},{likenum:NumberInt(1001)})

这样的话这条记录除了likenum字段其他字段都不见了,这并不是我们想要的结果。

(2)局部修改

为了解决以上的问题,我们需要使用修改器$set来实现,命令如下:

我们想修改 _id为2的记录,点赞量为889,输入语句如下:

db.comment.update({_id:"2"},{$set:{likenum:NumberInt(889)})

(3)批量修改

更新所有用户userid为101的用户昵称为“李均,牛逼”

//默认修改第一条数据
db.comment.update({userid:"101"},{$set:{nickname:“李均,牛逼”}})
//修改所有符合条件的数据
db.comment.update({userid:"101"},{$set:{nickname:“李均,牛逼”}},{multi:true})

提示:如果不加后面的参数,则只更新符合条件的第一条数据

(4)列值增长的修改

如果我们想实现对某列值在原有的基础上增加或减少,可以使用$inc运算符来实现

需求:对三号数据的点赞数,每次递增1

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

3.4.4文档的删除

删除文档的语法结构:

db.collection.remove(条件)

以下语句可以将所有的记录全部删除,请慎用

db.comment.remove()

如果要删除_id为1的记录,请输入以下的语句

db.comment.remove({_id:"1"})

3.5文档的分页查询

3.5.1统计查询

统计查询使用count()方法,语法如下:

db.collection.count(query,options)

参数:

ParameterTypeDescription
querydocument查询选择条件
optionsdocument可选。用于修改记数的额外选项。

提示:

可选项暂时不用。

示例:

(1)统计所有记数

统计comment集合中的所有记录数

db.comment.count()

(2)按条件统计记录数

db.comment.count({userid:"101"})

3.5.2分页列表查询

可以使用limit()方法来读取指定数量的数据,使用skip()方法来跳过指定数量的记录

基本语法:

db.collection.find().limit(NUMBER).skip(NUMBER)

如果你想返回指定条数的记录,可以在find后面使用limit方法来返回结果,limit()里面不写数字,就默认为20

db.collection.find().limit(3)

skip方法同样接收一个数字参数作为跳过的记录数。(前N个数据不要),默认值为0

db.collection.find().skip(2)

分页查询:需求:每页2个,第二页开始:跳过前两条数据,接着显示第3条和第4条数据

//第一页
db.comment.find().skip(0).limit(2)
//第二页
db.comment.find().skip(2).limit(2)
//第三页
db.comment.find().skip(4).limit(2)

3.5.3排序查询

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

语法如下:

db.collection.find().sort({KEY:1})

例如:

对userid进行降序排列,并对访问量进行升序排序

db.comment.find().sort({userid:1,likenum:-1})

提示:

skip() , limit() , sort()三个放在一起的执行顺序为 先是sort(),然后skip(),最后limit()。这个和我们命令编写顺序无关。

3.6文档的更多查询

3.6.1正则的复杂条件查询

MongDB的模糊查询是通过正则表达式的方式实现的。格式为:

db.collection.find({field:/正则表达式/})
或
db.集合.find(字段:/正则表达式/)

提示:正则表达式是js的语法,直接量的写法。

例如,我要查询评论内容包含 “天气” 的所有文档,写法如下:

db.comment.find({content:/天气/})

如果要查询评论内容是以 “我们” 开头的所有文档,写法如下:

db.comment.find({content:/^我们/})

3.6.2比较查询

<,<=,>,>=这个操作符也是很常用的,格式如下:

db.collection.find({"field":{$gt: value}}) //大于: field > value
db.collection.find({"field":{$lt: value}}) //小于: field < value
db.collection.find({"field":{$gte: value}}) //大于等于: field >= value
db.collection.find({"field":{$lte: value}}) //小于等于: field <= value
db.collection.find({"field":{$ne: value}}) //不等于: field != valu

示例:查询点赞量超过700的记录

db.comment.find({like:{$gt:NumberInt(700)}})

3.6.3包含查询

包含使用$in操作符

db.collection.find({field:{$in:["xx","xx"]}})

示例:查询评论的集合中userid的字段为103或104的文档

db.comment.find({userid:{$in:["103","104"]}})

不包含使用$nin操作符

3.6.4条件连接查询

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

格式为:

$and:[{},{},{}]

示例:查询评论集合中的likenum大于等于700并且小于2000的文档

db.comment.find({$and:[{likenum:{$gte:NumberInt(700)}},{likenum:{$lt:NumberInt(2000)}}]})

如果两个以上条件是或者的关系(相当于sql的or)

$or:[{},{},{}]

示例:查询评论集合中userid为1003,或者点赞数小于1000的文档

db.comment.find({$or:[{userid:"1003"},{likenum:{$lt:NumberInt(1000)}}]})

3.7常用命令小结

选择切换数据库: use articledb
插入数据: db.comment.insert({bson数据})
查询所有数据: db.comment.find()
条件查询数据: db.comment.find({条件})
查询符合条件的第一条记录: db.comment.findOne({条件})
查询符合条件的前几条记录: db.comment.find({条件}).limit(条数)
查询符合条件跳过前几条记录: db.comment.find({条件}).skip(条数)
修改数据:db.comment.update({条件},{修改后的数据}) 或db.comment.update({条件},{$set:{要修改的字段:数据}})
修改数据并自增某字段:db.comment.update({条件},{$inc:{某自增字段:步进值}})
删除数据: db.comment.remove({条件})
统计数据: db.comment.count({条件})
模糊查询:db.comment.find({字段名:/正则表达式/})
条件比较查询: db.comment.find({字段名:{$gt:值}})
包含查询: db.comment.find({字段名:{$in:[值1,值2]}})或db.comment.find({字段名:{$nin:[值1,值2]}})
条件连接查询: db.comment.find({$and:[{条件1},{条件2}]})或db.comment.find({$or:[{条件1},{条件2}]})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值