二、mongo学习之基础语法

核心概念:

mongodb中的库就类似于传统关系型数据库中库的概念,⽤来通过不同库隔离不
同应⽤数据 。
mongodb中可以建⽴多个数据库。每⼀个库都有⾃⼰的集合
和权限,不同的数据库也放置在不同的⽂件中。默认的数据库为"test",数
据库存储在启动指定的data⽬录中。

集合

集合就是 MongoDB ⽂档组,类似于 RDBMS (关系数据库管理系统:
Relational Database Management System)中的表的概念 。

集合存在于数据库中,⼀个库中可以创建多个集合。每个集合没有固定的
结构,这意味着你在对集合可以插⼊不同格式和类型的数据,但通常情况
下我们插⼊集合的数据都会有⼀定的关联性。

文档

⽂档集合中⼀条条记录,是⼀组键值(key-value)对(即 BSON)。MongoDB 的
⽂档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这
与关系型数据库有很⼤的区别,也是 MongoDB ⾮常突出的特点。

基本操作:

  • 查看所有库
	show databases;  
	show dbs;
  • 创建数据库
	user 库名  
  • 删除数据库
	db.dropDatabase()
  • 查看当前所在库
	db

集合

  • 查看库中所有集合
	show collections;  
	show tables
  • 创建集合
    Options参数为可选参数
    分别为:capped(固定集合) size(以字节为单位大小的固定集合) max(集合的最大条数)
	db.createCollection('集合名称',[Options])
  • 删除集合
	db.集合名称.drop();

文档

  • 插入文档
    # 插入单条文档  
    db.集合名称.insert({name:"小明",age:18,likes:["篮球","游戏","机车"]})
    #插入多条文档
    db.集合名称.insertMany(
    	[{name:"小红",age:22,likes:["跑步","美食","旅游"]},
    	{name:"小黄",age:25,likes:["游泳","羽毛球"]},
    	{name:"小蓝",age:14,likes:["画画","诗歌"]}],
    	{
		  writeConcern: 1,//写⼊策略,默认为 1,即要求确认写操作,0 是不要求。
 		  ordered: true //指定是否按顺序写⼊,默认 true,按顺序写⼊。
		}
    	)
	//脚本方式
	for(let i=0; i<100; i++){
		db.集合名.insert({_id:i,name:"user_"+i,age:i+10})
	}
  • 查询所有
	db.集合名.find();
  • 删除文档
db.集合名.remove(
	<query>,  # 删除的文档的条件,
	{
	  justOne: <boolean>,  # true或1 删除一条匹配的文档    false:删除所有匹配的文档
 	  writeConcern: <document>
	}
)
  • 更新文档
db.集合名称.update(
    <query>,
    <update>,
    {
	  upsert: <boolean>, # 查询的文档如果不存在是否插入
	  multi: <boolean>, # 默认false:只更新查询出的第一条, true:更新所有查询出的文档
	  writeConcern: <boolean>
	}
);


#例:
- db.集合名称.update({"name":"zhangsan"},{name:"11",bir:new date()})
 # 这个更新是将符合条件的全部更新成后⾯的⽂档,相当于先删除在更新
- db.集合名称.update({"name":"xiaohei"},{$set:{name:"mingming"}})
 # 保留原来数据更新,但是只更新符合条件的第⼀条数据
- db.集合名称.update({name:”⼩⿊”},{$set:{name:”⼩明”}},{multi:true}) 
 # 保留原来数据更新,更新符合条件的所有数据
- db.集合名称.update({name:”⼩⿊”},{$set:{name:”⼩明”}},{multi:true,upsert:true})
 # 保留原来数据更新,更新符合条件的所有数据 没有条件符合时插⼊数据

文档查询

语法:

#query :可选,使⽤查询操作符指定查询条件
#projection :可选,使⽤投影操作符指定返回的键。查询时返回⽂档中所有键值, 只需省略该参数即可(默认省略)。
db.集合名称.find(<query>,projection)

对比语法
对比语法

  • And
db.集合名称.find({age:{$gte:18},name:"zhangsan"})
  • Or
# 查询所有年龄大于等于65和小于等于18的用户(查询老年人和未成年人)
db.集合名称.find({$or:[{age:{$gte:65}},{age:{$lte:18}}]})
  • And和Or联合
# 查询所有成年人中年龄小于30或大于60的人
db.集合名称.find({age:{$gte:18},$or[{age:{$lte:30}},{age:{$gte:60}}]})
  • 数组中查询
#查询喜欢滑雪的用户
db.user.find({hobbies:"滑雪"});
#查询爱好数量
db.user.find({hobbies:{$size:3}})
  • 模糊查询
#查询名字中带有扎的
db.user.find({name:{$regex://}})
db.user.find({name://})
#利用正则进行前缀查询 查询名字以l开头的用户
db.user.find({name:/^l/})
  • 排序查询
#排序查询 根据年龄升序查询所有用户
db.user.find().sort({age:1})
#根据年龄降序查询所有用户 外加email降序
db.user.find().sort({age:-1,email:-1})
  • 分页
#分页查询
db.user.find().sort({age:-1,email:-1}).skip(0).limit(5)
  • 总条数
#db.集合名称.count()
#总条数 查询共有4个爱好的用户的人数
db.user.find({hobbies:{$size:4}}).count();
  • 去重
#去重
#返回值为包含去重字段的数组
db.user.distinct('age')
  • 指定返回字段 就是find()中的第二个参数projection
#查询所有成年用户,指定返回name和age两个字段
db.user.find({age:{$gte:18}},{name:1,age:1})
  • $type
#查询名字的类型是double的用户
db.find({name:{$type:1}})
  • $type类型对照图
    类型对照图

索引

说明:
索引通常能够极⼤的提⾼查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个⽂件并
选取那些符合查询条件的记录。这种扫描全集合的查询效率是⾮常低的,特别在处理⼤量的数据时,查询可
以要花费⼏⼗秒甚⾄⼏分钟,这对⽹站的性能是⾮常致命的。索引是特殊的数据结构,索引存储在⼀个易于
遍历读取的数据集合中,索引是对数据库表中⼀列或多列的值进⾏排序的⼀种结构。

  • 操作

创建索引:

#key值为你要创建的索引字段,1为升序创建索引,-1为降序创建索引
#db.user.createIndex(keys,options)
db.user.createIndex({name:1,age:-1})

创建索引options参数
options参数

#自定义索引的名字并设为唯一键
db.user.createIndexes({name:1,age:1},{unique:true,name:"name_age_index"})

聚合查询:

说明:
MongoDB 中聚合(aggregate)主要⽤于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似 SQL 语句中的 count(*)。

常见聚合表达式
常见聚合表达式

#根据年龄分组 并显示不同年龄的用户的数量
db.user.aggregate([{$group:{_id:"$age",cnt:{$sum:1}}}])
#根据爱好分组拥有相同爱好的为一组,并计算平均年龄
db.user.aggregate([{$group:{_id:"$hobbies",avg_age:{$avg:"$age"}}}])
#爱好分组,平均年龄,并把用户名字放到每个组中
db.user.aggregate([{$group:{_id:"$hobbies",avg_age:{$avg:"$age"},namelist:{$push:"$name"}}}])
#爱好分组,平均年龄,把每个组中第一个/最后一个放入组中
db.user.aggregate([{$group:{_id:"$hobbies",avg_age:{$avg:"$age"},namelist:{$first:"$name"}}}])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值