Mongoose第三方包常用操作整理

本文详细介绍了如何使用Node.js的mongoose模块操作MongoDB数据库,包括安装依赖、启动MongoDB服务、数据库连接、创建集合、验证规则、数据插入、查询、更新与删除等操作。同时展示了如何通过populate实现集合间的关联查询。
摘要由CSDN通过智能技术生成

依赖包安装

使用Node.js操作MongoDB数据库需要依赖Node.js第三方包mongoose

使用npm install mongoose命令下载

npm install mongoose

启动MongoDB

我们安装MongoDB时都是将其作为了Windown下的一个服务,只有服务启动了,我们才能连接它

一般默认情况下是已启动的,但有时关闭了需要我们重新启动

停止服务

net stop mongodb

启动服务

net start mongodb

数据库连接

使用mongoose提供的connect方法即可连接数据库,本地端口号默认为27017,如果当前数据库不存在则在插入文档时会自动创建

mongoose.connect('mongodb://localhost/demo')
.then(()=>{console.log('mongodb connected')})
.catch((err)=>{console.log(err)})

创建集合

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

// 设定集合规则
 const UserSchema = new mongoose.Schema({
     name: String,
     email: String,
     password: String
 });
// 创建集合并应用规则
 const User = mongoose.model('User', UserSchema); //返回的是一个集合的构造函数

mongoose验证

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

required: true 必传字段   不写默认false 非必传

minlength:5 字符串最小长度

maxlength: 20 字符串最大长度

const UserSchema = new mongoose.Schema({
    name: {
        type: String,
        required: [true,'需要传入字段'],//可以是数组的形式,第二个参数就是错误信息
        minlength: [2,'字符串需大于2'],
        maxlength: [10,'字符串需小于10'],
    }
})

min: 2 数值最小为2

max: 100 数值最大为100

const UserSchema = new mongoose.Schema({
    age: {
        type: Number,
        required: true,
        min: [2,'需要大于2'],
        max: 10
    }
})

enum: ['html', 'css', 'javascript', 'node.js']  枚举 传入字段的值必须是这几个

const UserSchema = new mongoose.Schema({
    course: {
        type: String,
        required: true,
        enum: {             //可以是对象形式来自定义错误信息
            values: ['html', 'css', 'javascript', 'node.js'],
            message: '不对' //自定义错误信息
        }
    }
})

trim: true 去除字符串两边的空格

validate: 自定义验证器

const UserSchema = new mongoose.Schema({
    string: {
        type: String,
        validate: {
            validator: v => {  //返回一个布尔值
                return v && v.length>3
            },
            message: '不合规则'
        }
    }
})

default: 默认值

const UserSchema = new mongoose.Schema({
    date: {
        type: Date,
        default: Date.now
    }
})

怎么直接拿到错误信息 

.catch(err=>{ for(var k in err.errors){
    console.log(err.errors[k].message)
} })

创建文档

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

第一种方法

首先创建集合实例

再调用实例对象下的save方法将数据保存到数据库中

//实例集合对象
const newUser = new User({
                name: 'mrz',
                email: 'email@155.com',
                password: '123456'
            })
//调用save
newUser.save()
.then(user=>console.log(user))
.catch(err=>console.log(err))

第二种方法

调用集合构造函数下的create方法

User.create({name: 'mrz',email: 'email@155.com',password: '123456'})
.then(user => console.log((user))
.catch(err => console.log(err))

也可以是回调函数的形式

User.create({name: 'mrz', email: 'email@155.com',password: '123456'}, (err, user) => { 
     //  错误对象
    console.log(err)
     //  当前插入的文档
    console.log(user)
});

mongoDB数据库导入数据

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

找到mongodb数据库的安装目录,将安装目录下的bin目录放置在环境变量中

查询文档

find查找

条件为空

//  根据条件查找文档(条件为空则查找所有文档)
User.find().then(result => console.log(result))

这里我已经插入了三条数据,返回结果为

[
  {
    _id: new ObjectId("618feb7a6eed97fb62aeb6bd"),
    name: 'mrz',
    email: 'email@155.com',
    password: '123456',
    __v: 0
  },
  {
    _id: new ObjectId("618fec049173df142ac75ccd"),
    name: 'mewu',
    email: 'email@163.com',
    password: '456789',
    __v: 0
  },
  {
    _id: new ObjectId("618fecc2147f6fd2bb0114ff"),
    name: 'xiaoz',
    email: '77@qq.com',
    password: '78988878',
    __v: 0
  }
]

有条件的查找

User.find({name: 'mewu'}).then(result=>console.log(result))

返回结果

[
  {
    _id: new ObjectId("618fec049173df142ac75ccd"),
    name: 'mewu',
    email: 'email@163.com',
    password: '456789',
    __v: 0
  }
]

 如果该条件查找不到

User.find({name: 'aa'}).then(result=>console.log(result))

返回结果为空数组 

 []

结论:find查找返回的都是一个数组

findOne查找

条件为空默认返回第一条数据

User.findOne().then(result=>console.log(result))

返回结果是一个对象

{
  _id: new ObjectId("618feb7a6eed97fb62aeb6bd"),
  name: 'mrz',
  email: 'email@155.com',
  password: '123456',
  __v: 0
}

添加条件

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

返回结果 

{
  _id: new ObjectId("618fecc2147f6fd2bb0114ff"),
  name: 'xiaoz',
  email: '77@qq.com',
  password: '78988878',
  __v: 0
}

 表达式查询文档

//  匹配大于 小于
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))

逆序就添一个负号 - 

//  skip 跳过多少条数据  limit 限制查询数量
User.find().skip(2).limit(2).then(result => console.log(result))

删除文档

删一个 没条件删第一个

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

 返回结果是我们删除的那条数据

{
  _id: new ObjectId("618feb7a6eed97fb62aeb6bd"),
  name: 'mrz',
  email: 'email@155.com',
  password: '123456',
  __v: 0
}

删多个 没条件全删 

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

返回结果为删除数量

{ deletedCount: 2 } 

更新文档

// 更新单个
User.updateOne({name: 'daz'},{name: 'xiaoz'}).then(result=>console.log(result))

 返回结果

{
  acknowledged: true,
  modifiedCount: 1,   //修改数量
  upsertedId: null,
  upsertedCount: 0,
  matchedCount: 1
}

// 更新多个 没条件全改
User.updateMany({}, {name: xxx}).then(result => console.log(result))

集合关联

关键字 populate  

我们需要至少两个集合

使用ID来将Job 与User进行关联

Job集合规则

type为  mongoose.Schema.Types.ObjectId  

ref 为你要关联的集合

将User某一数据ID传入person字段

const JobSchema = new mongoose.Schema({
    title: String,
    person: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
    }
})

const Job = mongoose.model('Job',JobSchema)

Job.create({title: '123',person: '618ffc49dc7ec67254b1e8ac'})
.then(result=>console.log(result))

返回结果

{
  title: '123',
  person: new ObjectId("618ffc49dc7ec67254b1e8ac"),
  _id: new ObjectId("618ffebd455c90187550eaf2"),
  __v: 0
}

 查找一下

Job.find().then(result=>console.log(result))

返回结果

[
  {
    _id: new ObjectId("618ffebd455c90187550eaf2"),
    title: '123',
    person: new ObjectId("618ffc49dc7ec67254b1e8ac"),
    __v: 0
  }
]

链式调用populate 传入要查询字段

Job.find().populate('person').then(result=>console.log(result))

返回结果

[
  {
    _id: new ObjectId("618ffebd455c90187550eaf2"),
    title: '123',
    person: {
      _id: new ObjectId("618ffc49dc7ec67254b1e8ac"),
      name: 'nizaigansm',
      age: 20,
      __v: 0
    },
    __v: 0
  }
]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值