Mongodb数据库

1.Mongodb概念

术语

概念

解释

database

数据库

mongoDB数据库软件中可以建立多个数据库

collection

集合

一组数据的集合,可以理解为JavaScript中的数组

document

文档

一条具体的数据,可以理解为JavaScript中的对象

field

字段

文档中的属性名称,可以理解为JavaScript中的对象属性

2.数据库操作

1.开启mongodb服务

在命令行工具中运行 net start mongodb 开启Mongodb服务;

2.创建数据库

在MongoDB中不需要显式创建数据库,如果正在使用的数据库不存在,MongoDB会自动创建;

3.数据库连接
// 引用mongoose包
const mongoose = require('mongoose');
// 数据库链接   会自动创建user数据库
mongoose.connect('mongodb://localhost/user')
	.then(() => console.log('数据库连接成功'))
	.catch(err => console.log('数据库连接失败', err));
4.创建集合规则及添加数据
//创建集合规则
//new mongoose.Schema 创建集合,实际上就是创建构造函数的实例对象,使用new操作符
//在里边传递一个对象,就是这个集合包含的属性 字段可以随意设置
//声明变量接收实例对象 courseSchema
const courseSchema = new mongoose.Schema({
    name:String,
    author:String,
    isPublished:Boolean
});
//使用规则创建集合 
//mongoose下边的方法model就是创建集合的,集合的名程首字母大写 在数据库里边显示的就是courses
//model的第一个参数集合名称,第二个参数就是在这个集合应用哪些规则  就是courseSchema规则
const Course = mongoose.model('Course',courseSchema);
//这个model方法有返回值,实际上就是这个集合的构造函数,用Course接收一下

//创建集合构造函数的实例 使用new关键字
//在里边插入一个对象 就是要插入的数据 ,这个对象里边的属性要和上边保持一致
// 用couse接收实例化对象
//创建文档
//构造函数的方式 是 异步操作
const course=new Course({
    name:'nodejs基础',
    author:'小明',
    //是否处于发布状态
    isPublished:true
})
//调用course下边的save方法,把course里边的数据(文档)插入到数据库里边
course.save();

/*************第二种插入数据方式****************/
向数据库中插入数据的第二种方式,使用create方法第一个参数是一个对象,第二个参数是回调函数,
//有回调函数意味着是异步API err是执行错误时返回的对象包含错误信息,result是内容
Course.create({
    name:'node12313',
    author:'小明',
    //是否处于发布状态
    isPublished:false
}).then(result=>{
    console.log(result)
}).catch(err=>{
    console.log(err)
})
5.查询文档

数据库中的数据

java操作mongodb数据库的gridFS mongodb数据库使用_mongodb数据库连接

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

//创建集合规则
//new mongoose.Schema 创建集合,实际上就是创建构造函数的实例对象,使用new操作符
//在里边传递一个对象,就是这个集合包含的属性 字段可以随意设置
//声明变量接收实例对象 userSchema
const userSchema = new mongoose.Schema({
    name:String,
    age:Number,
    email:String,
    password:String,
    hobbies:[String]
});
//使用mongoose.model创建user集合 使用userSchema
//返回用户集合的构造函数
const User = mongoose.model('User',userSchema);
//使用User集合规则查询文档

//查询用户集合中的所有文档  User.find() 返回promise对象可以使用then
// User.find().then(result=>console.log(result));

//通过find方法查询数据,无论多少条数据都返回一个数组,如果查询数据不存在,返回一个空数组
//通过id查询用户信息
// User.find({_id:'5c09f2d9aeb04b22f846096b'}).then(result => {console.log(result)})

//findOne方法返回一个对象  一条文档,默认返回当前集合中的第一条文档
// User.findOne({name:'李四'}).then(result => {console.log(result)});

//查询年龄大于20小于40的用户 $gt大于 $lt小于
// User.find({age: {$gt: 20, $lt: 40}}).then(result => console.log(result));

//查询爱好hobbies $in匹配包含 
// User.find({hobbies:{$in:['足球']}}).then(result => {console.log(result)})

//选择要查询的字段 里边包含_id  把_id去掉  添加-_id
// User.find().select('name email -_id').then(result => console.log(result));

//将数据按照年龄排序 升序
// 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));
6.删除文档
//查找到一条文档并且删除
//返回删除的文档
//如何查询条件匹配了多个文档,那么将会删除第一个匹配的文档
// User.findOneAndDelete({_id:'5c09f236aeb04b22f8460967'}).then(result => console.log(result))

//控制台 n代表删除几个数据  ok代表删除成功
User.deleteMany({}).then(result => console.log(result));
7.更新数据
//更新数据  第一个参数是查询对象  第二个参数是修改的
User.updateOne({name: '李四'}, {age: 120, name: '李狗蛋'}).then(result => console.log(result));

//更新多个数据
User.updateMany({},{age:300}).then(result => console.log(result));
//根据id更新
User.findByIdAndUpdate(id, {
    $set: {
         name:'笨蛋',
    	 age:13,
    }
}, err => {})
8.多集合联合查询
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/playground', { useUnifiedTopology: true, useNewUrlParser: true} )
    .then(()=> console.log('数据库连接成功'))
    .catch(err => console.log(err,'数据库连接失败'));

//创建集合规则
//new mongoose.Schema 创建集合,实际上就是创建构造函数的实例对象,使用new操作符
//在里边传递一个对象,就是这个集合包含的属性 字段可以随意设置
// 用户集合规则
const userSchema = new mongoose.Schema({
    name:{
        type:String,
        required:true
    }
});
// 文章集合规则
const postSchema = new mongoose.Schema({
    title:{
        type:String
    },
    author :{
        //规定好的mongodb当中的ObjectId字段的数据类型
        type:mongoose.Schema.Types.ObjectId,
        //关联的属性,在ref里边填写要关联的集合名称
        ref:'User'
    }
})
//用户集合
const User = mongoose.model('User',userSchema);
//文章集合
const Post = mongoose.model('Post',postSchema);

// //创建用户
// User.create({name:'itheima'}).then(result=>console.log(result));
// //创建文章
// Post.create({name:12345,author:'5d8e07fa13d3dc2340dd88ac'}).then(result=>console.log(result));

Post.find().populate('author').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’]
  • trim: true 去除字符串两边的空格
  • validate: 自定义验证器
  • default: 默认值

在catch中获取错误信息

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