依赖包安装
使用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
}
]