MongoDB 相关术语
在一个数据库软件中可以包含多个数据仓库,在每个数据仓库中可以包含多个数据集合,每个数据集合中可以包含多条文档(具体的数据)。
术语 | 解释说明 |
---|---|
database | 数据库,mongoDB数据库软件中可以建立多个数据库 |
collection | 集合,一组数据的集合,可以理解为JavaScript中的数组 (一个表) |
document | 文档,一条具体的数据,可以理解为JavaScript中的对象 (一条数据 行) |
field | 字段,文档中的属性名称,可以理解为JavaScript中的对象属性 |
数据库的连接
使用mongoose提供的connect方法即可连接数据库
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost/user', { useNewUrlParser: true ,useUnifiedTopology: true})
.then(() => console.log('数据的连接成功'))
.catch(err=> console.log('数据的连接失败', err))
在MongoDB中不需要显式创建数据库,如果正在使用的数据库不存在,MongoDB会自动创建。
创建集合(数据表)
- 设定集合规则,使用mongoose的Schema方法
- 创建集合 ,mongoose.model
// 设置集合规则
const courseSchema = new mongoose.Schema({
name: String,
author: String,
age: Number,
isPublished: Boolean
})
// 创建集合并使用定义的集合规则
// 返回一个构造函数
// 在数据库中创建一个叫courses的集合(表)
const Course = mongoose.model('Course', courseSchema)
创建文档
创建文档即为向集合中插入数据]
方法一:
步骤:
- 创建集合实例
- 调用实例对象下的save方法将数据保存到数据库中
// 创建集合实例
const course = new Course({
name: 'Node.js',
author: 'hyy',
age: 18,
isPublished:true
})
// 将数据保存到数据库中
course.save()
方法二
create为异步API,使用回调函数输出结果
Course.create({ name: 'Node.js', author: 'hyy', age: 18, isPublished: true }, (err, doc) => {
console.log(err); // 创建成功err为null
console.log(doc); // 插入的数据
})
mongodb下的api也支持Promise
Course.create({ name: 'Node.js', author: 'hyy', age: 18, isPublished: true })
.then(doc => console.log(doc))
.catch(err => console.log(err))
数据库导入数据
mongoimport -d 数据库名称 -c 集合名称 --file 要导入的数据文件
mongoimport -d test -c users --file user.json
MongoDB 增删改查操作
查询
- 查询所有
User.find().then(result => console.log(result))
- 查询所有满足条件的数据
User.find({ age: 20 }).then(result => console.log(result))
- 查询满足条件的一条数据,默认返回第一条
User.findOne({ age: 20 }).then(result => console.log(result))
4.查询集合中字段取值在某区间的文档, g t 、 gt、 gt、lt的使用
User.find({age:{$gt:15,$lt:30}}).then(result => console.log(result))
- 查询集合中数组字段值包含某值的文档
User.find({ hobbies :{$in:['足球']}}).then(result => console.log(result))
- 选择要查询的字段
User.find().select('neme age').then(result => console.log(result))
- 查询的数据进行排序
// 升序
User.find().sort('age').then(result => console.log(result))
// 降序排序
User.find().sort('-age').then(result => console.log(result))
- 查询文档跳过前几条结果 限制显示结果条数
可运用到页面分页显示中
User.find().skip(2).limit(3).then(result => console.log(result))
删除
- 删除满足条件的一条数据
User.findOneAndDelete({}).then(result => console.log(result))
- 删除满足条件的多条数据
User.deleteMany({}).then(result => console.log(result))
更新
1.修改满足条件的一条数据
// 第一个参数为查询条件
// 第二个参数为修改的值
User.updateOne({name: '李四'}, {age: 120, name: '李狗蛋'}).then(result => console.log(result))
2.修改满足条件的多条数据
User.updateMany({}, {age: 300}).then(result => console.log(result))
mongoose验证
1.required: true 必传字段
2.minlength:3 字符串最小长度
3.maxlength: 20 字符串最大长度
4.min: 2 数值最小为2
5.max: 100 数值最大为100
6.enum: [‘html’, ‘css’, ‘javascript’, ‘node.js’]
7.trim: true 去除字符串两边的空格
8.validate: 自定义验证器
9.default: 默认值
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true ,useUnifiedTopology: true})
.then(() => console.log('数据的连接成功'))
.catch(err => console.log('数据的连接失败', err))
const postSchema = new mongoose.Schema({
name: {
type: String,
//必传字段
required:[ true,'请传入文章标题'],
// 字符串最短长度
minlength: [2,'名字长度不能小于2'],
// 字符串最短长度
maxlength: [5,'名字长度不能大于5'],
// 去除字符串两边的空格
trim: true
} ,
age: {
type: Number,
// 最小值
min: 10,
// 最大值
max:100
},
email: {
type: String,
},
category:{
type: String,
// 枚举 列举出当前字段可以拥有的值
enum: {
values: ['html', 'css', 'javascript', 'vue'],
// 错误提示信息
message:'传入的分类不符合'
}
},
author: {
type: String,
validate: {
validator: v => {
// 返回布尔值
// true 验证成功
// false 验证失败
// v 要验证的值
return v && v.length > 4
},
// 自定义错误信息
message: '传入的值不符合验证规则'
}
},
date: {
type: Date,
// 设置默认值
default:Date.now
}
});
const post = mongoose.model('Post', postSchema)
post.create({ name: 'a', age: 60, category: 'css', author: 'bd' })
.then(result => console.log(result))
.catch(error => {
const err = error.errors
// 错误提示信息打印
for (var attr in err) {
console.log(err[attr]['properties']['message'])
}
})
集合关联
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true ,useUnifiedTopology: true})
.then(() => console.log('数据的连接成功'))
.catch(err => console.log('数据的连接失败', err))
// 定义用户规则
const userSchema = new mongoose.Schema({
name: {
type: String,
required:true
}
})
// 定义文章规则
const postSchema = new mongoose.Schema({
title: {
type: String,
required:true
},
author: {
// 使用ID将文章集合和作者集合进行关联
type: mongoose.Schema.Types.ObjectId,
ref:'User'
}
})
// 创建用户集合
const User = mongoose.model('User', userSchema)
// 创建文章集合
const Post = mongoose.model('Post',postSchema)
// 添加用户数据
User.create({ name: 'lisi' }).then(result => console.log(result))
// 添加文章数据
Post.create({title:'html',author:'5fffff0f21212c2894416b37'}).then(result => console.log(result))
// 联合查询
Post.find()
.populate('author')
.then(result => console.log(result))
输出结果: