MongoDB

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数据库的连接状态

    • 在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部分的固定代码封装成模块调用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值