MongoDB数据库教程(完)

第一章:MongoDB数据库介绍

数据库分为两种:关系型数据: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介绍

/*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来引入 

你可能感兴趣的:(数据库,mongodb,nosql)