MongoDB学习笔记

MongoDB 学习笔记

目标:

  • 能够安装数据库软件
  • 能够知道集合、文档的概念
  • 能够使用mongoose创建集合的方法创建集合
  • 能够对数据库中的数据进行增删改查

1. 数据库概述

1.1 数据库相关概念

一个数据库软件可以包含多个数据仓库,每个数据仓库可以包含对各数据集合(表),每个数据集合中可以包含多条文档(一条具体的数据 / 元组),字段(文档中的属性名称)

2. MongoDB数据库连接

  1. 使用Node.js操作MongoDB数据库需要依赖Node.js第三方包mongoose
  2. 在命令行工具中运行 net start mongoDB即可启动MongoDB,否则MongoDB无法连接
  3. 使用mongoose提供的 connect方法即可连接数据库
// 导入第三方包
const mongoose = require('mongoose');
//他发现没有这个数据库时,他会帮我们创建名称为这个的数据库
mongoose.connect('mongodb://localhost/palyground',{ useNewUrlParser: true })
 .then(()=>console.log('数据库连接成功'))
 .catch(err=>console.log('数据连接失败',err));

回到命令行工具,运行。会出现这个情况,就只需放到第二个参数的位置就可以,但是我不知道为什么会出现两个,但是两个都放进去又会报错。(暂时没有解决)如图:
在这里插入图片描述

3. 创建集合(表)

步骤:

  1. 对集合设定规则(string、char那些)
  2. 创建集合(构造函数)

操作完这一步,但是compass那不会显示数据库,因为你没有放入数据,放入数据后才会显示

//创建集合规则
const courseSchema= new mongoose.Schema({
 name:String,
 author:String,
 isPublished:Boolean
});
//使用规则创建集合
const Course=mongoose.model('Course',courseSchema);

4. 创建文档(元组)

就是向集合中插入数据
法一:
步骤:

  1. 创建集合实例
  2. 调用实例对象下的save方法将数据保存到数据库中
//创建文档
const course = new Course({
 name:'haixi',
 author:'lili',
 isPublished:true
});
// 将文档插入到数据库中
course.save();

法二: 集合(构造函数)的create方法

//创建文档
Course.create({name:'jsbase',author:'xixi',isPublished:true},(err,doc)=>{
 console.log(err);
 console.log(doc);
});
  1. 数据库的所有操作都是异步操作
  2. 在mongoose当中,它所提供的api支持两种获取异步api结果的方式
  • 回调函数的方式
  • 也支持promise的方式

和上面是一样的效果,打点调用then方法

Course.create({name:'jsbase123',author:'xixi',isPublished:true})
.then(resulet=>{console.log(resulet)})
.catch(err=>console.log(err));

5. mongoDB数据库导入数据

  1. 先要添加mongoimport的环境变量
  2. 在命令行工具中输入:mongoimport -d 数据库名称(你要导入到那个数据库) -c 集合名称(哪张表) --file 要导入的数据文件

注意:file那是两个-
要导入的时候就开个新窗口吧,别再原来打印了很多别的内容的窗口进行 (我这失败了一次)
集合名称以compass中显示的名字为准吧,我的是有带s (e.g users)

6. 查询文档

  • find( )
  • findOne( )

1. 条件为空则查找所有文档

// 根据条件查找文档(条件为空则查找所有文档)
Course.find().then(result=>{console.log(result)}
//返回的是一个数组,数组里包含了多个对象

2. 根据条件查找

// 通过id字段查找文档
User.find({_id:'5c09f2b6aeb04b22f846096a'}).then(result=>console.log(result));

通过find方法查询,无论查询出来的数据有多少,返回的都是一个数组

3.

User.findOne({name:'李四'}).then(result=>{console.log(result)});

findOne方法返回的是一个对象(一条文档) 默认返回当前集合的第一条文档

4. 一些其他例子(用到的时候再去查吧)

// 查询用户集合中年龄字段值大于20并小于40的文档
User.find({age:{$gt:20,$lt:40}}).then(result=>console.log(result));
//查询用户集合中hobbies字段值包含足球的文档
User.find({hobbies: {$in: ['足球']}}).then(result => console.log(result));
//选择要查询的字段
User.find().select('name email -_id').then(result => console.log(result)); // _id字段是默认就会查询出来的,不想要该结果只需在后头加上 -_id 就可以
//根据年龄字段进行升序排列
User.find().sort('age').then(result => console.log(result));
//根据年龄字段进行降序排列
User.find().sort('-age').then(result => console.log(result));
//查询文档跳过前两条结果 限制显示3条结果
User.find().skip(2).limit(3).then(result => console.log(result));

注意:

  1. 虽然你查找的内容可能是mongoDB数据库有的内容,但是js中仍要再写一遍 该集合的规则、使用规则创建集合
    不可以直接使用查找方法,否则会返回没有找到该集合
  2. _id字段是默认就会查询出来的,不想要该结果只需在后头加上 -_id 就可以

7. 删除文档

1. 删除单个文档
如果查询条件匹配了多个文档 那么将会删除第一个匹配的文档

// 返回删除的文档
User.findOneAndDelete({_id:'5c09f267aeb04b22f8460968'}).then(result=>console.log(result));

2. 删除多个文档

  1. 根据你要删除的查找条件,将集合中所有符合的都删除
  2. 当你传入的是一个空对象,默认会将你user中的所有文档删除
User.deleteMany({要删除的对象(查询条件)}).then(result=>console.log(result));

8. 更新文档

1. 更新一条文档

User.updateOne({查询条件},{要修改的值}).then(result=>console.log(result))

User.updateOne({name:'李四'},{name:'李狗蛋'}).then(result=>console.log(result));

2. 更新多条文档

User.updateMany({查询条件},{要修改的值}).then(result=>console.log(result))

User.updateMany({},{age:300}).then(result=>console.log(result))

9. mongoose验证

一般都是会用上这个的

在创建集合规则时,可以设定当前字段的验证规则,验证失败就输入插入失败

  • required:true 必传字段
  • minlength:3 字符串最小长度
  • maxlength:20 字符串最大长度
  • min:2 数值最小为2
  • max: 100 数值最大为100
  • enum:[‘html’,‘css’,‘javascript’,‘node.js’]
  • tirm:true 去除字符串两边的空格
  • vlidate: 自定义验证器
  • default: 默认值

例子:

// 引入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']);
  }
 })

10. 集合关联 (连接)

在做项目的过程中是非常重要的

  • 使用id对集合进行关联
  • 使用populate方法进行关联集合查询

代码讲解

const mongoose=require('mongoose');
//连接
mongoose.connect('mongodb://localhost/playground',{ useNewUrlParser: true})
	.then(()=>console.log('数据库连接失败,才怪!'))
	.catch(err=>console.log(err,'数据库连接失败'));

//创建集合,这次简化了一步
const User=mongoose.model('User',new mongoose.Schema({
	name:{
		type:String,
		required:true
	}
}));

const Post =mongoose.model('Post',new mongoose.Schema({
	title:{type:String},
	//使用id将文章集合与作者集合进行关联
	//此处的mongoose.Schema.Types.ObjectId 是id的特有写法。写type为id时就这么写
	author:{type:mongoose.Schema.Types.ObjectId,ref:'User'}
}));

//创建用户实例(放入数据啦)
// User.create({name:'lili'}).then(resulet=>console.log(resulet));
// 创建完就要注释掉,否则你在创建文章的时候它又会创建一条
//创建文章实例(放入数据啦)
// Post.create({title:'haohao',author:'5e7dae46be5bea18e82c1946'}).then(resulet=>console.log(resulet));
// // //联合查询
Post.find().populate('author').then(resulet=>console.log(resulet));

在这里插入图片描述

  • 32612

初步接触的小白,单纯看视频和跟着敲有时也不大能消化,所以觉得敲一份笔记捋一捋会好些,也便于日后查找。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值