📕前端也要懂点数据库

107 阅读4分钟

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情

本文介绍一款轻量,灵活,可玩性高的数据库它就是MongoDB,它是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

下载地址 http://www.mongodb.org/downloads

可视化界面建议安装navicat,它是款收费软件,但是...,懂得都懂(需要的私我)!

image.png

MongoDB优点

  • MongoDB的提供了一个面向文档存储,操作起来比较简单和容易。
  • 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。
  • 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
  • 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
  • Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
  • MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
  • Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
  • Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
  • Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
  • GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
  • MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
  • MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
  • MongoDB安装简单。

MongDB启动

将MongoDB服务器作为Windows服务运行。

输入以下命令:

F:\mongodb\bin>mongod --dbpath "f:\data\db" --logpath "f:\data\log\mongodb.log" --serviceName "mongodb" --serviceDisplayName "mongodb" --install

看到了如下输出:

2016-10-20T23:32:46.339+0800 I CONTROL  log file "f:\data\log\mongodb.log" exists; moved to "f:\data\log\mongodb.log.2016-10-20T15-32-46".

说明mongodb服务安装成功。启动mongodb服务:

F:\mongodb\bin>net start mongodb MongoDB 服务已经启动成功。

说明mongodb启动成功。

由于我们并没有指定mongodb服务的端口号,所以它启动在默认的27017窗口。

打开浏览器,范围地址http://127.0.0.1:27017/,可看到如下信息

It looks like you are trying to access MongoDB over HTTP on the native driver port.

数据库操作

//1.创建数据库
use database_name(数据库库名) 如果数据库存在选择存在的数据库,不存在则创建数据库
注意:数据库中不存放任何数据,数据库列表中不会显示
//2.删除数据库 删除当前正在使用的数据库
db.dropDatabase()
//3.查看数据库列表
show dbs

表的操作

//创建表
db.createCollection("表名",{})
//删除表
db.collection_name.drop()
//显示所有表
show collections
//往数据库中创建一个表(空的表)
db.createCollection("表名");

表的插入操作

MongoDB 使用 insert() 或 save() 方法向集合中插入文档,语法如下:
db.collection_name.insert({})
或
db.collection_name.save({})

save():如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.collection_name.insertOne() 或 db.collection_name.replaceOne() 来代替。
insert(): 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。
3.2 版本之后新增了 db.collection_name.insertOne() 和 db.collection_name.insertMany()。
建议使用insertOne({}),insertMany([{},{}]);

表的修改操作

db.collection_name.update(
  { 
  	修改的条件
  },
    {
        $set: {
    		字段1:字段1的新值,
    		字段2:字段2的新值,   
   	      }
    }
  ,{
      multi:true/false
  }
)
如果你要修改多条相同的文档,则需要设置 multi 参数为 true,设置为false默认只会修改第一条数据。

举栗子说明:
db.collection_name.update({"stuName":"jack"},{$set: {"stuName":"tom"}},{multi:true})

表的删除操作

//单独删除
db.collection_name.deleteOne({"字段名":"字段值"})
db.collection_name.deleteMany({"字段名":"字段值"})
//批量删除
db.collection_name.deleteMany({"字段名":{$in: ["字段值","字段值"]}})

举栗子说明:
//单条删除
db.collection_name.deleteOne({"stuPass":"1234"})
db.collection_name.deleteMany({"stuName":"张飞"})
//批量删除
db.collection_name.deleteMany({"stuName":{$in: ["张飞","关羽"]}})

表的查询操作

//对单个表进行全部查询
db.collection_name.find()
//条件查询
db.collection_name.find({字段名:"字段值"})
我们也可以对某个字段进行多值匹配如下栗子,查询_id为1,3,5,7的用户:
db.collection_name.find({_id:{$in:[1,3,5,7]}});
//在某个数值范围内查询
$gt (>) $gte (>=)   $lt < $lte(<=)
举个栗子查询数字大于8.6小于等于10的范围内:
db.collection_name.find({num:{$gt:8.6,$lte:10.0}});
//模糊查询
直接举几个栗子更形象:
<1>.查询所有名字中包含三的用户信息
db.collection_name.find({userName:/三/});
<2>.查询所有姓张的用户信息
db.collection_name.find({userName:/^张/});
<3>.查询所有以三结尾的用户信息
db.collection_name.find({userName:/三$/});
//查询排序
db.collection_name.find().sort({'字段名':1})
1:正序,-1:倒序
我们可以加些条件进行排序处理,比如下面这个栗子,根据评分进行降序排列,如果评分一样 那么根据价格顺序排列(多条件排序)
db.collection_name.find({}).sort({Score:-1,Price:1});
//分页查询
db.collection_name.find({}).skip(跳过多少条数据).limit(查询多少条数据);
举个栗子,我们查前三条数据:
db.collection_name.find({}).skip(0).limit(3);

分组聚合

//聚合统计之前的条件过滤 (只能写表中的字段)
db.collection_name.aggregate(
{
	$match:{字段名:{$gt:30}}
},
{
 $group:{
	  _id:"$字段名",
	  count:{$sum:1},
          sum:{$sum:"$字段名"},
	  avg:{$avg:"$字段名"},
	  max:{$max:"$字段名"},
          min:{$min:"$字段名"}
	}
},//真正的聚合查询
{
	$match:{avg:{$gte:60}}
},//对聚合出来的数据进行 筛选
{
	$sort:{avg:-1}
},//对最终的结果进行排序
{
	$limit:1
}//对最终排序的结果进行截取
);

image.png

联表查询

//三表联查(例如我们有这三张表分别是app,appType,appPlatform)
db.app.aggregate([//app 主表
	{
                //一般放置条件筛选后的数据例如:appList
		$match:{appTypeId:1,appPlatformId:1,appName:{$regex:"A"}}
	},
	{
		$lookup:{
			from:"appType",//联表1
			localField:"appTypeId",// app中与 联表进行关联的字段 字段名字
			foreignField:"_id",//联表中与app相关联的字段名字
			as:"appType"// 给联表查询出来的数据取个别名 一般使用联表名即可
		}
	},
	{
		$lookup:{
			from:"appPlatform",//联表2
			localField:"appPlatformId",
			foreignField:"_id",
			as:"appPlatform"
		}
	},
	{
		$sort:{appDownLoadCount:1}
	},
	{
		$skip:0
	},
	{
		$limit:6
	}
]);

以上都是个人平时接触比较多的语法(不全面),如有不当,请批评指正,互相学习借鉴谢谢!