MongoDB是一个基于分布式文件储存的数据库,目前是世界上用的最多的非关系型数据库,也是最像关系型的非关系型数据库。
MongDB以BSON(二进制+JSON)格式进行数据存储。
1.MongoDB 下载与安装
MongoDB 官网地址
https://www.mongodb.com/
MongoDB 下载地址
https://www.mongodb.com/download-center/community
MongoDB for Windows 64-bit 适合64位Windows Server 2008 R2,Windows 7,及最新版本的Window系统。
2.MongoDB 文件
2.MongoDB 设置环境变量
form:
https://blog.csdn.net/lxd8731247769/article/details/51201024
3.创建文件夹
在非系统盘创建文件夹:E:\zjx\lianxi\data
E:\zjx\lianxi\data\db 用于存放数据库
E:\zjx\lianxi\data\log 用于存放日志文件
4.将MongoDB安装为windows服务(重点中的重点)
当mongod.exe被关闭时,mongo.exe就无法连接到数据库了,因此每次想使用MongoDB数据库都要开启mongod.exe程序,所以比较麻烦,此时我们可以将MongoDB安装为Windows服务。
以管理员身份运行cmd,进入bin文件夹,执行下列命令:
mongod –dbpath “E:\zjx\lianxi\data\db” –logpath “E:\zjx\lianxi\data\log\MongoDB.log” –install –serviceName “MongoDB”
32位系统要加 –storageEngine mmapv1 选择mmapv1存储引擎
这里MongoDB.log就是开始建立的日志文件,–serviceName “MongoDB” 服务器命名为MongoDB
接着启动mongodb服务
>NET START MongoDB
补充:
mongodb是服务器名称
net stop mongodb 关闭服务
sc delete mongodb 卸载服务器
5.数据库基础命令
数据库 =》 集合 =》 文档
1.进入数据库管理模式
在命令行中运行 mongo 进入数据库管理模式
在数据库管理模式中只能执行数据库命令,不能执行其他命令
exit 可以退出数据库管理模式
2.常用数据库命令
a.显示所有数据库列表 show dbs
b.创建数据库命令/进入数据库命令 use + 数据库名
//如果数据库名不存在则创建数据库,如果数据库存在则进入数据库。
c.查看当前数据库 db
d.删除数据库 db.dropDatebase();
3.集合的命令
a.显示当前数据库中的所有集合 show collections
b.创建集合 db.集合名.insert({});
//通常,在创建数据时自动创建集合,不需要单独创建
c.删除集合 db.集合名.drop();
4.文档(数据)的命令(重点中的重点)
a.新增文档(数据)
db.集合名.insert({BSON数据});
db.集合名.save({BSON数据});
例如:
db.user.insert({“name”:“admin”,“password”:“123456”});
db.user.insert({“name”:“张三丰”,“age”:“1000”});
db.list.insert({“name”:“刘备”,“age”:“29”});
insert和save方法的区别:
.insert() 向集合中插入一条数据 (推荐使用)
.save() 向集合中添加一条数据,如果集合中已存在该条数据则更新
b.查看文档(数据)
db.集合名.find(); //查找当前集合中的所有数据
db.集合名.find({条件对象}); //查找当前集合中的所符合条件的数据
db.集合名.findOne(); //查找第一条数据 或 按_id查询
db.集合名.find().pertty(); //将找到的数据按格式化显示出来
c.修改文档(数据)
db.集合名.update(查找对象,修改结果)
db.集合名.update({“name”:“a1”},{“age”:10})
修改name为a1的数据中所有数据都改为{“age”:10}
db.集合名.update({“name”,“a1”},{$set:{“age”:10}})
$set 修改其中的一节
修改name为a1的数据中age的值为10
d.删除文档(数据)
db.user.remove({}) 删除user集合下所有数据
db.user.remove({“name”,“张三丰”}) 删除user集合name=”张三丰”的数据
注意:由于删除和更新操作会对数据造成极大影响,所以一定要谨慎!谨慎!再谨慎!!更新和删除之前先备份!!!!
5.文档(数据)的高级命令(重点中的重点)
1.按指定条件查询
//需求:查找所有的女歌星
db.singer.find({“sex”:“女”});
//SQL:select * form singer where sex=“女”
//需求:查找所有的中国男歌手
国籍:中国
性别:男
db.singer.find({“country”:“中国”,“sex”:“男”});
//SQL:select * form singer where country=“中国” and sex=“男”
2.大于
语法:db.集合名.find({字段名,{$gt:值}})
//需求:年龄大于50岁的歌星
db.singer.find({“age”,{ $gt:50}})
//SQL:select * from singer where age>50
3.大于等于
语法:db.集合名.find({字段名,{$gte:值}})
//需求:年龄大于等于50岁的歌星
db.singer.find({“age”,{ $gte:50}})
//SQL:select * from singer where age>=50
4.小于
语法:db.集合名.find({字段名,{$lt:值}})
//需求:年龄小于30岁的歌星
db.singer.find({“age”,{ $lt:30}})
//SQL:select * from singer where age<50
5.小于等于
语法:db.集合名.find({字段名,{$lte:值}})
//需求:年龄小于等于30岁的歌星
db.singer.find({“age”,{ $lte:30}})
//SQL:select * from singer where age<=50
6.查询指定范围的数据
语法:db.集合名.find({字段名,{$gt:小值, $lt:大值}})
//需求:年龄30-40岁之间的歌星
db.singer.find({“age”,{ $gt:30, $lt:40}})
//SQL:select * from singer where age>30 and age<40
//SQL:select * from singer where age>30 and age<40
7.查询不符合条件的数据
语法:db.集合名.find({字段名,{$ne:值}})
//需求:查询外国歌手,条件为country不为“中国”
db.singer.find({“country”,{ $ne:“中国”}})
//SQL:select * from singer where age>30 and age<40
8.$ in 字句
语法:db.集合名.find({字段名,{$in:[值1,值2,值3]}})
//需求:找出刘德华 张学友 郭富城
db.singer.find({“name”,{ $in:[“刘德华”,“张学友”,“郭富城”]}})
//SQL:select * from singer where name in (‘刘德华’,‘张学友’,‘郭富城’)
9.$ size 字句
语法:db.集合名.find({字段名,{$size:数值}})
字段名所对应的必须为数组
//需求:找出有3个代表作的歌手
db.singer.find({“works”:{ $size:3}})
//SQL:不能存放数组
10.$ exists字句
语法:db.集合名.find({字段名,{$exists:true|false}})
判断字段是否存在
$exists字段存在 true返回存在的字段数据,false返回不存在字段的数据
11.$ or字句
$ or 查找多条件时,符合其中之一就找出来
语法:db.集合名.find({$or:[{“字段名1”:值},{“字段名2”:值}]})
//需求:某个娱乐公司15个人,资料都在数据库里,某个活动必须要刘德华参加,另外需要团队的全部女歌手配合演出。查询符合条件的歌手资料
db.singer.find({ $or:[{“name”:“刘德华”},{“sex”:“女”}]})
//SQL:select * from singer where name=“刘德华” or sex=“女”
12.排序
语法:db.集合名.find({}).sort({“key1”:1,“key2”:-1})
说明:1是升序,-1是降序 key1条件相同时按住key2排序
//需求:歌手按照年龄降序排序 年龄相同时按分数升序排列
db.singer.find({}).sort({“age”:-1,“score”:1})
13.限定输出 limit() skip()
.limit(数字) //限定输出数据的条数
.skip(数字) //跳过指定的数据条数
主要用于做分页
//需求:只查找年龄最大的3个人
db.singer.find({}).sort({“age”:-1}).limit(3);
//需求:查找年龄在第三第四第五的人
db.singer.find({}).sort({“age”:-1}).skip(2).limit(3)
14.模糊查询
语法:db.集合名.find({“字段名”:/值/})
//需求:查询名字中带刘的歌星
db.singer.find({“name”:/刘/}
6.mongoose的安装及使用
1.什么是mongoose?
mongose是一个基于node.js的用于操作MongoDB数据库的第三方模块
2.mongoose的安装
先安装express框架
$ npm install mongoose
3.mongoose的使用
a.链接数据库
mongoose.connect(“mongodb:127.0.0.1:27017/数据库名”,function(err){
if(err){
throw err;
}else{
console.log(“数据库链接成功”);
};
});
b.定义骨架 Schema
Schema概念:它可以理解为数据库模型骨架,可以看做工厂中的模具一样,好比一个茶杯,喝水是茶杯最终的功能,茶杯本身就像是Model,name茶杯的批量生产是需要靠工厂的模具成型的。Schema不仅
定义了文档结构和使用性能
,还可以扩展插件、实例方法、静态方法、符合索引、文档生命周期钩子。
Schema:一种以文件形式储存的数据库模型骨架,不具备数据库的操作能力。
Model:由Schema发布生成的模型,具有抽象属性和行为的数据库操作。
Entity:由Model创建的实体,他的操作也会影响数据库。
储存数据步骤:定义Schema(骨架)=>创建model(模型)=>Entity实例化方法。
语法:var schema = new mongoose.Schema({
字段名:类型,
字段名:类型.
})
类型:String Number Date Buffer(缓存、二进制) Boolean Mixed(混合类型) ObjectId Array(数组)
实例:var singerSchema = new mongoose.Schema({
name:String,
country:String,
age:Number
})
c.创建模型model
概述:model模型是一种根据骨架创建出来的模型,具备数据库操作能力,通常用于读取数据库数据
语法:var singerModel = mongoose.model(“模型名称”,“骨架”,“集合名称”);
模型名称和集合名称保持一致,提高稳定性
实例:var singerModel = mongoose.model(‘singer’,‘singerSchema’,‘singer’)
d.创建实体entity
概述:Entity实体是根据模型创建出一个实例,具备数据库操作的能力,通常用于写数据(新增、修改、删除)
实例:var singer = new singerModel();
singer.属性名=值;
singer.属性名=值;
singer.属性名=值;
…
singer.save();//将添加实例上的属性保存到数据库
singer.remove();//删除数据
7.增删改查(数据操作)
1.读取数据/查询数据
方法1:根据条件进行数据查询,可以找出多条数据
模型.find({条件},function(err,data){
//data是从数据库中读取到的数据
//find方法找出的数据一定是个数组,即使没有数据也是一个空数组
})
方法2:查找一条数据
模型.findById(‘id’,function(){
//findById找出来的数据是一个对象
})
方法3:链式调用exec(为了实现查询条件+顺序)
模型.find({}).skip().limit().exec(function(){
//data是从数据库中读取到的数据
})
2.新增数据
var list = new listModel();//按照模型创建实体
list.name=“张三”;
list.age=18;
list.save(function(err){
console.log(“新增成功!”)
});//将新增的数据保存到数据库中
注意:如果骨架中没有定义属性及类型,是不能加进数据库。
3.删除数据
思路:
第一步:先找出要删除的数据。
第二步:调用实体上的remove()方法
实例:listModel.findById(id).exec(funcition(err,data){
data.remove(function(err){
//console.log
(“删除成功”);
data.remove(function (err) {
res.send(”
“+id+“已删除
”)
});
})
})
4.修改数据
思路:
第一步:找出被修改的数据
第二部:将数据修改后保存回数据库
实例:listModel.findById(id).exec(funcition(err,data){
data.name=新的值;
data.age=新的值;
data.save(function (err) {
res.send(“
修改成功
”)
});
})