文章目录
1. MongoDB
- MongoDB是一个NoSQL的数据库
- MongoDB是一款文档型数据库
- 数据库指的就是一个存储数据的仓库
数据库可以使我们完成对数据的持久化的操作 - MongoDB数据库中存储的数据的基本单位就是文档,
MongoDB中存储的就是文档,所谓文档其实就是一个“JSON” - MongoDB中的“JSON”我们称为BSON,比普通的JSON的功能要更加的强大
- MongoDB数据库使用的是JavaScript进行操作的,在MongoDB含有一个对ES标准实现的引擎,
在MongoDB中所有ES中的语法中都可以使用
1.1 MongoDB的基本的指令
启动服务器
mongod --dbpath 路径 --port 端口号
启动客户端
mongo
1.2 MongoDB的CRUD的操作
基本操作
use 数据库
- 进入指定的数据库
show dbs
- 显示所有的数据库
show collections
- 显示数据库中所有的集合
db
- 显示当前所在的数据库
向数据库中插入文档
db.collection.insert()
- insert()可以向集合中插入一个或多个文档
db.collection.insertOne()
- 向集合中插入一个文档
db.collection.insertMany()
- 向集合中插入多个文档
查询数据库中的文档
db.collection.find()
- 可以根据指定条件从集合中查询所有符合条件的文档
- 返回的是一个数组
db.collection.findOne()
- 查询第一个符合条件的文档
- 返回的是一个对象
db.collection.find().count()
- 查询符合条件的文档的数量
-查询文档时,默认情况是按照_id的值进行排列(升序)
-sort()可以用来指定文档的排序的规则,sort()需要传递一个对象来指定排序规则 1表示升序 -1表示降序
-limit skip sort 可以以任意的顺序进行调用
db.emp.find({}).sort({sal:1,empno:-1});
- 在查询时,可以在第二个参数的位置来设置查询结果的 投影
db.emp.find({},{ename:1 , _id:0 , sal:1});
- 查看numbers集合中的第11条到20条数据
/*
分页 每页显示10条
1-10 0
11-20 10
21-30 20
。。。
skip((页码-1) * 每页显示的条数).limit(每页显示的条数);
skip()用于跳过指定数量的数据
MongoDB会自动调整skip和limit的位置
*/
db.numbers.find().skip(10).limit(10);
//查询工资在1000-2000之间的员工
db.emp.find({sal:{$lt:2000 , $gt:1000}});
//查询工资小于1000或大于2500的员工
db.emp.find({$or:[{sal:{$lt:1000}} , {sal:{$gt:2500}}]});
//为所有薪资低于1000的员工增加工资400元
db.emp.updateMany({sal:{$lte:1000}} , {$inc:{sal:400}});
db.emp.find();
//查询财务部的所有员工
//(depno)
var depno = db.dept.findOne({dname:"财务部"}).deptno;
db.emp.find({depno:depno});
//查询销售部的所有员工
var depno = db.dept.findOne({dname:"销售部"}).deptno;
db.emp.find({depno:depno});
修改数据库中的文档
db.collection.update()
- 可以修改、替换集合中的一个或多个文档
db.collection.updateOne()
- 修改集合中的一个文档
db.collection.updateMany()
- 修改集合中的多个文档
db.collection.replaceOne()
- 替换集合中的一个文档
删除集合中的文档
db.collection.remove()
- 删除集合中的一个或多个文档(默认删除多个)
db.collection.deleteOne()
- 删除集合中的一个文档
db.collection.deleteMany()
- 删除集合中的多个文档
清空一个集合
db.collection.remove({})
删除一个集合
db.collection.drop()
删除一个数据库
db.dropDatabase()
1.3 文档间的关系
一对一(one to one)
- 夫妻 (一个丈夫 对应 一个妻子)
- 在MongoDB,可以通过内嵌文档的形式来体现出一对一的关系
一对多(one to many)/多对一(many to one)
- 父母 - 孩子
- 用户 - 订单
- 文章 - 评论
- 也可以通过内嵌文档来映射一对多的关系
多对多(many to many)
- 分类 - 商品
- 老师 - 学生
db.wifeAndHusband.insert([
{
name:"黄蓉",
husband:{
name:"郭靖"
}
},{
name:"潘金莲",
husband:{
name:"武大郎"
}
}
]);
db.wifeAndHusband.find();
//一对多 用户(users) 和 订单(orders)
db.users.insert([{
username:"swk"
},{
username:"zbj"
}]);
db.order.insert({
list:["牛肉","漫画"],
user_id: ObjectId("59c47e35241d8d36a1d50de0")
});
db.users.find()
db.order.find()
//查找用户swk的订单
var user_id = db.users.findOne({username:"zbj"})._id;
db.order.find({user_id:user_id});
//多对多
db.teachers.insert([
{name:"洪七公"},
{name:"黄药师"},
{name:"龟仙人"}
]);
db.stus.insert([
{
name:"郭靖",
tech_ids:[
ObjectId("59c4806d241d8d36a1d50de4"),
ObjectId("59c4806d241d8d36a1d50de5")
]
},{
name:"孙悟空",
tech_ids:[
ObjectId("59c4806d241d8d36a1d50de4"),
ObjectId("59c4806d241d8d36a1d50de5"),
ObjectId("59c4806d241d8d36a1d50de6")
]
}
])
db.teachers.find()
db.stus.find()
2. Mongoose
2.1 前期准备
-
下载安装Mongoose
npm i mongoose --save -
在项目中引入mongoose
var mongoose = require(“mongoose”); -
连接MongoDB数据库
mongoose.connect(‘mongodb://数据库的ip地址:端口号/数据库名’, { useMongoClient: true});- 如果端口号是默认端口号(27017) 则可以省略不写
-
断开数据库连接(一般不需要调用)
- MongoDB数据库,一般情况下,只需要连接一次,连接一次以后,除非项目停止服务器关闭,否则连接一般不会断开
mongoose.disconnect()
- MongoDB数据库,一般情况下,只需要连接一次,连接一次以后,除非项目停止服务器关闭,否则连接一般不会断开
-
监听MongoDB数据库的连接状态
-
在mongoose对象中,有一个属性叫做connection,该对象表示的就是数据库连接
通过监视该对象的状态,可以来监听数据库的连接与断开 -
数据库连接成功的事件
mongoose.connection.once(“open”,function(){}); -
数据库断开的事件
mongoose.connection.once(“close”,function(){});
-
//引入
var mongoose = require("mongoose");
//连接数据库
mongoose.connect("mongodb://127.0.0.1/mongoose_test" , { useMongoClient: true});
mongoose.connection.once("open",function(){
console.log("数据库连接成功~~~");
});
mongoose.connection.once("close",function(){
console.log("数据库连接已经断开~~~");
});
//断开数据库连接
mongoose.disconnect();
2.2 Schema
//将mongoose.Schema 赋值给一个变量
var Schema = mongoose.Schema;
//创建Schema(模式)对象
var stuSchema = new Schema({
name:String,
age:Number,
gender:{
type:String,
default:"female"
},
address:String
});
2.3 Model
创建对象
//通过Schema来创建Model
//Model代表的是数据库中的集合,通过Model才能对数据库进行操作
//mongoose.model(modelName, schema):
//modelName 就是要映射的集合名 mongoose会自动将集合名变成复数
var StuModel = mongoose.model("student" , stuSchema);
增
- Model.create(doc(s), [callback])
- 用来创建一个或多个文档并添加到数据库中
- 参数:
doc(s) 可以是一个文档对象,也可以是一个文档对象的数组
callback 当操作完成以后调用的回调函数
StuModel.create([
{
name:"沙和尚",
age:38,
gender:"male",
address:"流沙河"
}
],function (err) {
if(!err){
console.log(arguments);
}
});
查
-
Model.find(conditions, [projection], [options], [callback])
- 查询所有符合条件的文档 总会返回一个数组
-
Model.findById(id, [projection], [options], [callback])
- 根据文档的id属性查询文档
-
Model.findOne([conditions], [projection], [options], [callback])
-
查询符合条件的第一个文档 总和返回一个具体的文档对象
-
conditions 查询的条件
-
projection 投影 需要获取到的字段
- 两种方式
{name:1,_id:0}
“name -_id”
- 两种方式
-
options 查询选项(skip limit)
{skip:3 , limit:1} -
callback 回调函数,查询结果会通过回调函数返回
回调函数必须传,如果不传回调函数,压根不会查询
-
-
Model.count(conditions, [callback])
- 统计文档的数量的
StuModel.find({name:"唐僧"},function (err , docs) {
if(!err){
console.log(docs);
}
});
StuModel.find({},{name:1 , _id:0},function (err , docs) {
if(!err){
console.log(docs);
}
});
StuModel.find({},"name age -_id", {skip:3 , limit:1} , function (err , docs) {
if(!err){
console.log(docs);
}
});
StuModel.findOne({} , function (err , doc) {
if(!err){
console.log(doc);
}
});
StuModel.findById("59c4c3cf4e5483191467d392" , function (err , doc) {
if(!err){
//console.log(doc);
//通过find()查询的结果,返回的对象,就是Document,文档对象
//Document对象是Model的实例
console.log(doc instanceof StuModel);
}
});
StuModel.count({},function (err , count) {
if(!err){
console.log(count);
}
});
删
- Model.remove(conditions, [callback])
- Model.deleteOne(conditions, [callback])
- Model.deleteMany(conditions, [callback])
StuModel.remove({name:"白骨精"},function (err) {
if(!err){
console.log("删除成功~~");
}
});
改
- Model.update(conditions, doc, [options], [callback])
- Model.updateMany(conditions, doc, [options], [callback])
- Model.updateOne(conditions, doc, [options], [callback])
- 用来修改一个或多个文档
- 参数:
conditions 查询条件
doc 修改后的对象
options 配置参数
callback 回调函数 - Model.replaceOne(conditions, doc, [options], [callback])
//修改唐僧的年龄为20
StuModel.updateOne({name:"唐僧"},{$set:{age:20}},function (err) {
if(!err){
console.log("修改成功");
}
});
2.4 Document
- Document 和 集合中的文档一一对应 , Document是Model的实例
- 通过Model查询到结果都是Document
//创建一个Document
var stu = new StuModel({
name:"奔波霸",
age:48,
gender:"male",
address:"碧波潭"
});
stu.save(function (err) {
if(!err){
console.log("保存成功~~~");
}
});
StuModel.findOne({},function (err , doc) {
if(!err){
/*
update(update,[options],[callback])
- 修改对象
remove([callback])
- 删除对象
*/
doc.update({$set:{age:28}},function (err) {
if(!err){
console.log("修改成功~~~");
}
});
doc.age = 18;
doc.save();
doc.remove(function (err) {
if(!err){
console.log("大师兄再见~~~");
}
});
/*
get(name)
- 获取文档中的指定属性值
set(name , value)
- 设置文档的指定的属性值
id
- 获取文档的_id属性值
toJSON() ******
- 转换为一个JSON对象
toObject()
- 将Document对象转换为一个普通的JS对象
转换为普通的js对象以后,注意所有的Document对象的方法或属性都不能使用了
*/
console.log(doc.get("age"));
console.log(doc.age);
doc.set("name","猪小小");
doc.name = "hahaha";
console.log(doc._id);
var j = doc.toJSON();
console.log(j);
var o = doc.toObject();
console.log(o);
doc = doc.toObject();
delete doc.address;
console.log(doc._id);
}
});
2.5 模块化
- 将连接数据库、schema部分的固定代码封装成模块调用