mongoose数据库概述及环境搭建

1.数据库相关概念

在一个数据库软件中可以包括多个数据仓库,在每个数据仓库中可以包含多个数据集合,每个数据集合中可以包含多条文档(具体的数据)。

术语解释说明
database数据库,MongoDB数据库软件中可以建立多个数据库
collection(表)集合,一组数据的集合,可以理解为javaScript中的数组
document(数据)文档,一条具体的数据,可以理解为javaScript中的对象
field字段,文档中的属性名称,可以理解为JavaScript中的对象属性

2.Mongoose点三方包

  • 使用Node.js操作MongoDB数据库需要依赖Node.js第三方包mongoose
  • 使用npm install mongoose命令下载

3.启动MongoDB(必须管理员权限下运行)

在命令行中关闭MongoDB:net stop mongodb

在命令行中启动MongoDB:net start mongodb

4.连接数据库

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

5.创建数据库

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

6.创建集合

创建集合分为两步,一是对集合设定规则,二是创建集合,创建mongoose.Schema构造函数的实例即可创建集合。

//设定集合规则
const courseSchema=new mongoose.Schema({
    name:String,
    author:String,
    isPublished:Boolean
});
//创建集合并应用规则
const Course=mongoose.model("Course",courseSchema);//Courses

7.1创建文档方法一

创建文档实际上就是向集合中插入数据

  • 创建集合实例
  • 调用实例对象下的save方法将数据保存到数据库中。
//创建集合实例
const Course=new Course({
    name:'Node.js course',
    author:'学生',
    tags:['node','backend'],
    isPublished:true
});
//将数据保存到数据库中
Course.save();

7.2创建集合文档方法二

Course.create({
    name:'javascript基础',
    author:'学生',
    isPublish:true
},(err,doc)=>{
    //错误对象
    console.log(err);
    //当前插入的文档
    console.log(doc);
})
Course.create({name:'javascript基础',author:'',isPublish:true})
      .then(doc=>{console.log(doc)})
      .catch(err=>{console.log(err)})

8.mongoDB数据库导入数据

导入数据前首先找到mongodb数据库的安装目录,将安装目录下的bin目录放置在环境变量中。

mongoimport -d数据库名称 -c 集合名称 --file要导入的数据文件

mongoimport -d playground -c users --file ./user.json

9查询文档

//根据条件查找文档(条件为空则查找所有文档)
Course.find().then(result=>console.log(result))
//返回文档集合
[{
    _id:sdfsdfsdfsdfds,
    name:'node.js',
    author:'学生'
},{
    _id:sdfdsfgghhdfgd,
    name:'javascript',
    author:'乔晓琪'
}]

通过ID进行查询

Course.find({_id:'sdffffsdfsdfsdf'}).then(result=>console.log(result))

findOne方法返回一条文档默认返回当前集合中的第一条文档

User.findOne({name:'javascript'}).then(result=>console.log(result))
//匹配大于$gt 小于$lt
User.find({age:{$gt:20,$lt:50}}).then(result=>console.log(result))
//匹配包含
User.find({hobbies:{$in:['敲代码']}}).then(result=>console.log(result))
//选择要查询的字段
User.find().select('name email').then(result=>console.log(result))
//将数据按年龄进行升序排列
User.find().sort('age').then(result=>console.log(result))
//将数据按年龄进行降序排列
User.find().sort('-age').then(result=>console.log(result))
//skip跳过多少条数据 limit限制查询数量
User.find().skip(2).limit(2).then(result=>console.log(result))

10.删除文档

//删除单个
//查找到一条文档并且删除
//返回删除的文档
//如果查询条件匹配了多个文档那么将会删除第一个匹配的文档
Course.findOneAndDelete({_id:'sdfdsfdsfdsgg'}).then(result=>console.log(result))

//删除多个
User.deleteMany({}).then(result=>console.log(result))

11.更新文档

//更新单个
User.updateOne({查询条件},{要修改的值}).then(result=>console.log(result))
//例子
User.updateOne({name:'李四'},{name:'张三'}).then(result=>console.log(result))
//更新多个
User.updateMany({查询条件},{要更改的值}).then(result=>console.log(result))
//例子
User.updateMany({},{age:56}).then(result=>console.log(result))

12.mongoose验证

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

  • required:true|false必传字段
  • minlength:number最小长度(只针对字符串类型)
  • maxlength:number最大长度(只针对字符串类型)
  • min:number(只针对数值类型)
  • max:number(只针对数值类型)
  • trim:true|false去除两边的空格
  • default(默认值):Date.now(当前时间)
  • enum(枚举类型):[‘java’,‘html’,‘css’] (表示要传入的值必须是java、html、css)
  • validate:自定义验证器
//例子
const postSchema=new mongoose.Schema({
    title:{
        type:String,
        //required:true,
        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:'html',author:'db'})
    .then(result=>console.log(result))
    .catch(error=>{
        //获取错误信息对象
        const err=error.errors;
        //循坏错误信息对象
        for(var attr in err){
            //将错误信息打印到控制台中
            console.log(err[attr]['message']);
        }
})

13.集合关联(表关联)

通常不同集合的数据之间是有关联的,例如文章信息和用户信息存储在不同集合中,但文章是某个用户发表的,要查询文章的所有信息包括发表用户,就需要用到集合关联(也就是多表关联)。

//用户集合
const User=mongoose.model('User',new mongoose.Schema({
    name:{
        type:String
    }
}));
//文章集合
const Post = mongoose.model('Post',new mongoose.Schema({
    title:{
        type:String
    },
    //使用ID将文章集合和作者集合进行关联
    author:{
        type:mongoose.Schema.Types.ObjectId,
        ref:'USER'
    }
}));

//联合查询
Post.find()
    .populate('author')
    .then((err,result)=>console.log(result));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值