数据库分为两种:关系型数据:RDBMS:MySQL,Oracle,DB2,SQLserver
关系型数据库中全都是表
非关系型数据库:NoSQL,Not Only Monggo DB,redis
这里的数据库是文档形数据库MongoDB数据库
MongoDB数据库是位了快速开发互联网Web应用而设计的数据库系统
MongoDB数据库的设计是极简,灵活 作为web应用技术的一部分
MongoDB的数据库是面向文档的,所谓文档就是类似json结构,就是Bson
三个概念:
数据库:
集合:
文档:
1.下载MongoDB数据库
2.安装MongoDB数据库
1.安装--->2.配置环境变量 E:\MongoDB\bin
-配置完毕 cmd输入mongod
-在c盘根目录中创建员工data文件夹,在data中创建文件夹db
-打开命令行窗口:输入mongod 启动服务器
-在打开一个cmd窗口:输入mongo 连接mongodb ,出现 > 服务器启动成功
更改数据库文件的位置:--dbpath +路径
数据库database:服务器:用来保存数据
客户端:用来操作数据
要操作数据库就先启动服务器
将mongo设置为系统服务,可以自动在后台启动,不需要每次都手动启动
1、在data文件夹下创建log文件夹
2.创建配置文件:在目录下添加配置文件
这里软件语句默认配置完成
3.以管理员身份运行命令行
mongodb基本操作:
数据库:数据库就是一个仓库
集合:在集合中最小存放文档
文档:文档数据库中的最小定位,我们存储和操作内容都是文档
基本指令:
show dbs
show databases 就是显示所有的数据库
use +数据库名 表示进入数据库中
在mongodb中集合和数据库都不需要手动创建,自动创建,进入数据库的时候不用去创建数据库,直接use+数据库
db:表示当前所处的数据库
show collections 显示数据库中的所有集合
数据库的增删改查操作:
1.向数据库中插入文档
db..insert(doc) 向集合中插入员工文档
例如:
{name:"孙悟空",age:18;sex:"男"}
db.stus.insert({name:"孙悟空",age:18;sex:"男"})
db..find() 查看当前集合中的文档
图形化处理工具的安装:
默认使用idea系列数据库管理工具
数据的添加操作:
use admin;
show collections;
//1.向数据库中插入文档(insert)
//语法:db..insert()
//向集合中插入员工或多个文档
//当我们向集合中插入文档时,如果没有给定文档的id属性,数据库会自动添加,确保唯一,数据库自动根据时间来插入
db.stus.insert({name:"吴邪",age:28,gender:"男"});
db.stus.find();
//2.向数据库中插入多个数据
db.stus.insert([
{name: "解雨臣",age:"12",gender:"男"},
{name: "张起灵",age:"12",gender:"女"},
{name: "黑瞎子",age:"22",gender:"男"},
{name: "王胖子",age:"22",gender:"男"},
]);
//2.也可以自己指定id属性
db.stus.insert([
{id:1, name: "解雨臣",age:"12",gender:"男"},
{id:2, name: "张起灵",age:"12",gender:"女"},
{id:3, name: "黑瞎子",age:"22",gender:"男"},
{id:4,name: "王胖子",age:"22",gender:"男"},
]);
/*指定插入对象的个数*/
//3.db.collection.insertOne()--插入一个文档对象
//4. db.collection.insertMany--插入多个文档对象
数据的查询
//二:查询
//语法:db.collection.find();
//find:查询集合中所有满足条件的文档
db.stus.find()
//find()中科院接受员工对象作为参数
db.stus.find({})//这个{}表示查询集合中所有的文档
db.stus.find({name:"吴邪"})//{属性:值}查询属性指定的文档
//多条件查询
db.stus.find({name:"吴邪",age:"28",gender:"男"})
//注意:find返回的是一个数组:因此可以使用如下的格式
db.stus.find({name:"吴邪"})[1]
db.stus.findOne();//用来查询集合中符合条件的第一个文档
//findOne()返回的是一个文档对象
//统计个数
db.stus.find({}).count();
数据的修改
//三:数据的修改:db.stus.update({查询条件},{修改后的对象(新对象)})
db.stus.find({});
//注意:updata会替换掉原来的所有,因此要使用修改操作符
//$set 可以原来修改文档中的指定属性
db.stus.update(
{"id":"1"},
{ $set:{
gender:"女",
age:"38"
}}
);
//$unset 删除指定文档的属性
db.stus.update(
{"id":"1"},
{ $unset:{
gender:"女",
age:"38"
}}
);
//update()默认只改一个
//db.collection.updateMany:同时修改多个符合条件的文档
//db.collection.updateOne:修改符合一个条件的文档
db.stus.updateMany(
{"name":"解雨臣"},
{
$set:{
gender:"28"
}
}
)
//db.collection.replaceOne()替换一个文档
数据的删除:
//四:数据的删除
/*db.collection.remove()--删除符合条件的所有文档,默认情况下删除多个文档,
如果remove()第二个参数传递员工TRUE,则只会删除一个
* db.collection.deleteOne()--
* db.collection.deleteMany()
*
* 1.remove()可以根据条件删除文档,传递条件的方式和find(0一样
* */
db.stus.find({});
//db.collection.remove()--删除符合条件的所有文档,默认情况下删除多个文档,
// 如果remove()第二个参数传递员工TRUE,则只会删除一个
db.syus.remove({"name":"吴邪"},true);
//如果传递员工空对象作为参数,则清空集合
db.stus.remove({})//如果要删除集合,建议不要使用这个方法
db.stus.drop();//这个方法就是删除集合的正规方法
db.dropDatabase();//这个是删除数据库,谨慎使用
//在开发的时候一般不会删除数据库,因此这样的方法很少调用,数据删除的影响很大
//一般会在数据中添加字段,来表示数据是否被删除
db.stus.insert([
{name:"霍秀秀" ,age:"29"},
{name: "张启山",age: 30},
{name: "赵云",age: "20"},
])
// 1.进入my_test数据库
use my_test;
//2.向数据库user集合中插入一个文档
db.user.insert({
username:'猪八戒'
});
//3.查询Uuser集合中的文档
db.user.find();
//向use中插入一个文档
db.user.insert({
username:'孙悟空'
})
//4.统计文档中的数量
db.user.find().count();
//7.查询数据库user集合username的文档
db.user.find({username:'猪八戒'});
//8.向数据库user集合中的username 为孙悟空的文档添加一个集合,属性为地址
db.user.update({
username:'孙悟空'
},{$set:{address:"花果山"}}
)
//9.使用username替换为
db.user.replaceOne({username:"猪八戒"},{username:"吴邪"});
//10.s删除uesername为吴邪的文档
db.user.update({username:"吴邪"},{$unset:{address}});
//11.向username为吴邪的文档中添加一个hobby,属性
db.user.update({username:"吴邪"},{$set:{hobby:["北京"]}});
db.user.find().user;
db.stus.insert([
{name:"吴邪",address:"吴山居",age:"38",sex:"男"},
{name:"解雨臣",address:"北京",age:"35",sex:"男"},
{name:"张起灵",address:"吴山居",age:"35",sex:"男"},
{name:"王胖子",address:"北京",age:"34",sex:"男"},
])
//push用于向数组中添加一个新的元素
//向数据库中插入2万条数据
for (var i = 0; i < 10000; i++) {
db.stus.insert({name:i,age:35+i,address:"吴山居"+i})
}
db.stus.find();
//查询文档中年龄小于等于39的人
db.stus.find({age:39});
//查询大于35的文档
db.stus.find({age:{$gt:500}});
//查询大于等于的
db.stus.find({age:{$gte:400}});
//查询大于400小于500的文档
db.stus.find({age:{$gt:400,$lt:500}});
//查询前10条数据
db.stus.find({age:{$gt:10}});
//使用limit来设置显示的数据页数,括号里面的数据是查询的条数
db.stus.find().limit(10);
//查询11到20条数据
/*
* 分页:每页显示10条
* skip()用来跳过指定数量的数据
* */
db.stus.find().skip(10).limit(20);
/*文档间的关系:
* 1.一对一:在MongoDB中可以跳过内嵌文档的形式来体现出一对一的关系
* 2.一对多:使用内嵌文档
* 3.多对一:
* 4.多对多:
* */
db.wi.insert([
{name:"吴邪"},
{name:"黑瞎子"},
{name:"张起灵"},
])
//查询文档时,默认情况按照_id的值去排列
//因此使用sort()可以堆文档进行排序,括号里面需要传递一个镀锡来当做排序的规则,1是升序,-1是降序
db.stus.find({}).sort({age:1})
//limit skip sort 可以容易顺序调用
db.stus.find({},{name:1});//查询时,可以在第二个参数的位置来设置查询结果的投影
/*mongoose是一个让我们可以跳过node来操作MongoDB的模块
* 是一个对象文档库,它对node原生的js
* 可以为文档创建一个模式结果
* 可以堆面向中的对象/文档进行验证
* 数据可以跳过类型转换为对象模型
* 可以使用中间件来应用业务逻辑挂钩
* 比node原生的MongoDB驱动更容易
*
*
* MongoDB中为我们提供了价格新的镀锡:模式对象 model document三者是有顺序的
*
* 使用方式:
* */
/*
* 1.下载安装Mongoose--npm i mongoose --save
*
* 2.在项目中引入Mongoose----var mongoose=require(“mongoose”)
*
* 3.
* 如果端口号是27017,则可以默认不写
*
* 连接mongodb数据库:mongoose.connect('mongodb://数据库的ip地址:端口号/数据库名',{useMongoClint:true})
*
* --监听数据库的连接状态--在mongoose对象中,有一个属性connection 该对象表示的就是数据库的连接,通过监视该对象的状态,可以监听
* 数据库的连接和断开
*
*
* 数据库成功的事件
* mongoose.connection.once(”open“,function(){})
* 数据库失败的事件
* mongoose.connection.once(”close“,function(){})
* 断开数据库的事件:mongoose.disconnect()
* */
//1.引入
var mongoose=require("mongoose");
//连接数据库
mongoose.connect("mongodb://127.0.0.1/my_test",{useMongoClient: true});
mongoose.connection.once("open",function (){
console.log("连接成功!")
});
mongoose.connection.once("close",function () {
console.log("数据库已经断开!");
})
//断开数据库连接
mongoose.disconnect();
//schema ==>model===>document
var mongoose=require("mongoose");
mongoose.connect("mongodb://127.0.0.1/my_test",{useMongoCClient:true});
mongoose.connection.once("open",function () {
console.log("你好!数据库连接成功!")
});
//创建schema对象
//将mongoose.schema赋值给一个变量
var Schema=mongoose.Schema;
//创建Schema()对象
var stuSchema=new Schema({
name:String,
gender:{
type:String,
default:"female"
}
age:Number,
address:String
})
//通过Schema来创建model
// model代表的数据库中的集合,通过model才能对数据库进行操作
var stuModel=mongoose.model("student",stuSchema);
//向数据库中插入一个文档
stuModel.create({
name:"孙悟空",
age:18,
gender:"medel",
address:"花果山"
},function (err) {
if (!err){
console.log("插入成功!");
}
})
//注意mongoose会自动变化单复数
var mongoose=require("mongoose");
mongoose.connect("mongodb://127.0.0.1/my_test",{useMongoCClient:true});
mongoose.connection.once("open",function () {
console.log("你好!数据库连接成功!")
});
//创建schema对象
//将mongoose.schema赋值给一个变量
var Schema=mongoose.Schema;
//创建Schema()对象
var stuSchema=new Schema({
name:String,
gender:{
type:String,
default:"female"
},
age:Number,
address:String
})
//通过Schema来创建model
// model代表的数据库中的集合,通过model才能对数据库进行操作
var stuModel=mongoose.model("student",stuSchema);
//向数据库中插入一个文档
stuModel.create({
name:"孙悟空",
age:18,
gender:"medel",
address:"花果山"
},function (err) {
if (!err){
console.log("插入成功!");
}
})
//使用model。我们就可以来对数据库进行增删改差的操作
//model.create(doc(c),{}callback)
//用来创建一个或多个文档并添加到数据库中
//-参数:doc(c) 可以是一个完蛋对象,也可以是一个文档对象的数组
//callback 当操作完成后调用的回调函数
stuModel.create([ {
name:"猪八戒",
age:29,
gender:"male",
address:"高老庄"
},
{
name:"唐僧",
age:12,
gender: "me",
address: "高老庄"
}
]
)
//文档的查询
stuModel.find({name:"唐僧"},function (err,docs) {
if (!err){}
console.log(docs[1]);//返回一个数组
})
stuModel.find({},{name:1 , _id:0},function (err,docs) {
if (!err){}
console.log(docs[1]);//返回一个数组
})
stuModel.findById({})
//修改:
//用来修改一个或多个文档
//-参数:condition 查询条件
//doc 修改后的对象
//--option 配置参数
//callback回调函数
stuModel.updateOne({name:"唐僧"},{$set:{age:20}},function (err) {
if (!err){
console.log("修改成功!")
}
})
//删除
stuModel.remobe({anem:"孙悟空"},function (err) {
if (!err){
console.log("删除成功!");
}
})
//统计文档数量
stuModel.count({},function (err,count) {
console.log(count)
})
/*document:和集合中的文档有一一对应,document是model的一个实例
* */
var mongoose=require("mongoose");
mongoose.connect("mongodb://127.0.0.1/my_test",{useMongoCClient:true});
mongoose.connection.once("open",function () {
console.log("你好!数据库连接成功!")
});
//创建schema对象
//将mongoose.schema赋值给一个变量
var Schema=mongoose.Schema;
//创建Schema()对象
var stuSchema=new Schema({
name:String,
gender:{
type:String,
default:"female"
},
age:Number,
address:String
})
//创建一个document对象
var stu=new StuModel({
name:"唐僧",
age:29,
gender:"male",
address:"花果山"
})
/*document方法:
* model#save{[option],[fn]}
*
* */
stu.save(function (err) {
if (!err){
console.log("保存成功!")
}
})
/*
* get(name):获取文档中的谁知道属性值
* set(name,value) 设置文档指定的属性值
* id--获取文档的id属性值
*
*
* */
//mongoose模块化:吧系统的镀锡,每次都要使用的东西去封装起来,当做工具使用
//定义一个模块
var mongoose=require("mongoose");
//连接数据库
mongoose.connect("mongodb://127.0.0.1/my_test",{useMongoClient: true});
mongoose.connection.once("open",function (){
console.log("连接成功!")
});
mongoose.connection.once("close",function () {
console.log("数据库已经断开!");
})
//把以上代码封装为一个文件夹,调用的时候通过require来引入