MongoDB数据库 笔记

1 篇文章 0 订阅

数据库基本概念

在这里插入图片描述

Node.js对数据库的相关操作

需要用mongoose第三方模块

数据库的启动和关闭
  • 启动数据库:在命令行中用net start mongoDB命令启动数据库,数据库启动成功才能被连接
  • 关闭数据库:net stop mongoDB
连接数据库

使用mongoose.connet()方法可以连接数据库,若要连接的数据库不存在,则会创建该数据库。该方法是一个异步函数,返回的是一个promise对象,mongoose中的大多方法都是异步函数,因此可以用then和catch接收返回内容和错误
在这里插入图片描述

创建集合

集合可以理解为一张数据表,包含多条数据(记录)。node.js中创建集合分两步:

  1. 设定集合规则,也就是确定数据表有哪些列,每一列的数据类型是什么。用mongoose.Schema(),它是一个构造函数
  2. 利用设定的集合规则创建集合。mongoose.model()方法创建集合,返回一个构造函数,代表这个集合
// 设定集合规则 ,实例化Schema
let courseSchema = new mongoose.Schema({
    courseName: String,
    author: String
});
// 创建集合
let Course = mongoose.model('Course', courseSchema); // 返回一个构造函数,代表该course集合
mongoose集合规则验证

在创建集合规则时,可以设置当前字段的验证规则,比如字符串的最短、最长长度,数字的最小最大范围等,在添加文档时必须符合验证规则,否则会报错

// 引入mongoose第三方模块 用来操作数据库
const mongoose = require('mongoose');
// 数据库连接
mongoose.connect('mongodb://localhost/playground', { useNewUrlParser: true})
	// 连接成功
	.then(() => console.log('数据库连接成功'))
	// 连接失败
	.catch(err => console.log(err, '数据库连接失败'));

const postSchema = new mongoose.Schema({
	title: {
		type: String,
		// 必选字段
		required: [true, '请传入文章标题'],
		// 字符串的最小长度
		minlength: [2, '文章长度不能小于2'],
		// 字符串的最大长度
		maxlength: [5, '文章长度最大不能超过5'],
		// 去除字符串两边的空格
		trim: true
	},
	age: {
		type: Number,
		// 数字的最小范围
		min: 18,
		// 数字的最大范围
		max: 100
	},
	publishDate: {
		type: Date,
		// 默认值, 没有输入时设为默认值
		default: Date.now
	},
	category: {
		type: String,
		// 枚举 列举出当前字段可以拥有的值
		enum: {
			values: ['html', 'css', 'javascript', 'node.js'],
			message: '分类名称要在一定的范围内才可以'
		}
	},
	author: {
		type: String,
		// 自定义验证规则
		validate: {
			validator: v => {
				// 返回布尔值
				// true 验证成功
				// false 验证失败
				// v 要验证的值
				return v && v.length > 4
			},
			// 自定义错误信息
			message: '传入的值不符合验证规则'
		}
	}
});

const Post = mongoose.model('Post', postSchema);

Post.create({title:'aa', age: 60, category: 'java', author: 'bd'})
	.then(result => console.log(result))
	.catch(error => {
		// 获取错误信息对象
		const err = error.errors;
		// 循环遍历错误信息对象
		for (var attr in err) {
			// 将错误信息打印到控制台中
			console.log(err[attr]['message']);
		}
	})

MongoDB数据库导入json格式数据

可以将json格式存储的数据直接导入到MongoDB中,mongoDB中数据其实也是以json格式存储的
使用命令mongoimport -d 数据库 -c 集合 --file 到导入的文件名
例如:mongoimport -d first -c users --file D:\user.json
注意要把mongoimport.exe所在的文件路径添加到计算机Path环境中,否则命令行无法识别ongoimport命令

添加数据(创建文档)

添加数据是向数据库中的某个集合中添加,即创建文档,并添加到集合中,文档可以理解为一条记录(数据),有两种方法

  1. 实例化集合的构造函数 Course
// 方法1. 实例化Course 创建一个文档,记录一条数据
let courseMath = new Course({
    courseName: 'Math',
    author: 'teaZhang'
})

// 将数据存储到数据库中
courseMath.save();
  1. 用集合的构造函数的create()方法
// 方法2. 通过Course构造函数的create()方法创建文档 该方法有两种使用形式:
// 1 回调函数参数形式获取内容和错误
Course.create({
    courseName: 'English',
    author: 'teaWang'
}, (err, result) => {
    console.log(err);
    console.log(result);
});

// 2 create()返回的是一个promise对象,通过.then(),.catch()获取内容和错误
Course.create({
        courseName: 'yuwen',
        author: 'teaLi'
    })
    .then(result => console.log(result))
    .catch(err => console.log(err));
查询文档

用集合的构造函数的find()方法,查询多个文档,返回的是一个数组,用findOne()方法,查询一个文档。括号中传入查询条件作为参数。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

删除文档

在这里插入图片描述

更新文档

在这里插入图片描述

集合关联

ref populate
比如作者信息(作者id,名字name)这个集合author和文章集合article(文章标题title,文章作者author)进行关联,想要实现查询文章作者的信息的目的,让文章集合中的作者字段为用户信息集合中的id值。

// 作者Author集合规则
let authorSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true
    }
})

let Author = mongoose.model('Author', authorSchema);
// 文章Aticles集合规则
let aticleSchema = new mongoose.Schema({
    title: String,
    author: {  // 文章作者字段,和Author集合的作者id字段关联
        type: mongoose.Schema.Types.ObjectId, // author字段的数据类型为mongodb中的id类型
        ref: 'Author' // 该集合中的author字段和Author集合进行关联
    }
})
let Aticles = mongoose.model('Aticles', aticleSchema);
// populate()方法可以让设置了关联集合的字段显示所关联集合的信息
Aticles.find().populate('author').then(result => console.log(result));

查询结果显示了所有的文章,文章的作者字段显示了作者的详细信息。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值