mongoDB 学习笔记

MongoDB是一种面向文档的非关系型(NoSQL)数据库

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

Mongoose第三方包

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

启动MongoDB

在命令行工具中运行net start mongoDB即可启动MongoDB,否则MongoDB将无法连接。

数据库连接

使用mongoose提供的connect方法即可连接数据库。

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

创建数据库,

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

创建集合

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

1
2
3
4
5
6
7
8
//设定集合规则
const courseSchema = new mongoose.Schema({
name: String,
author: String,
isPublished: Boolean
}) ;
//创建集合并应用规则 首字母大写
const Course = mongoose.model('Course',courseSchema); // courses

创建文档

创建文档实际上就是向集合中插入数据。
分为两步:
①创建集合实例。
②调用实例对象下的save方法将数据保存到数据库中。

1
2
3
4
5
6
7
8
9
//创建集合实例
const course = new Course ({
name: 'Node.js course',
author: '黑马讲师',
tags: ['node','backend'],
isPublished: true
}) ;
//将数据保存到数据库中
course.save () ;

创建文档

1
2
3
4
5
6
Course.create ({name:'JavaScript基础',author: '黑马讲师',isPublish: true}, (err, doc) => {
//错误对象
console.log (err)
//当前插入的文档
console.log (doc)
});
1
2
3
Course.create ({name: ' JavaScript基础',author: ' 黑马讲师',isPublish: true})
.then(doc => console. log (doc) )
.catch(err => console. log(err) )

mongoDB数据库导入数据

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

查询文档

1
2
3
4
5
6
7
8
9
10
11
12
13
//根据条件查找文档(条件为空则查找所有文档) 
Course.find().then(result => console. log (result) )
//返回文档集合 数组
[{
_id: 5c0917ed37ec9b03c07cf95f ,
name :
'node. js基础'
author: ' 黑马讲师、
},{
id: 5c09dea28acfb814980ff827 ,
name:' Javascript ' ,
author:,黑马讲师、
}]

查询文档

1
2
3
4
5
6
7
8
9
// findOne方法返回一条文档默认返回当前集合中的第一条文档 返回对象
Course.findone ( {name :
'node. js基础' }). then (result => console. log (result) )
//返回文档 对象
{
id: 5c091 7ed37ec9b03c07cf95f ,
name: 'node. js基础'
author: '黑马 讲师、
}

查询文档

1
2
3
4
5
6
7
8
9
10
//匹配 大于$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))
//将数据按照年龄进行排序 默认升序 '-age'降序
User.find().sort('age') . then(result => console.log(result))
// skip 跳过多少条数据limit 限制查询数量
User.find().skip(2).limit(2).then(result => console.log (result))

删除文档

1
2
3
4
5
6
7
8
//删除单个
//查找到一条文档并且删除
//返回删除的文档
//如何查询条件匹配了多个文档那么将会删除第个匹配的文档
Course.findOneAndDelete({}).then(result => console.log(result))
//删除多个
//返回对象{n:4,ok:1} n数据数量,ok:1 删除成功
User.deleteMany({}).then(result => console.log(result))

更新文档

1
2
3
4
//更新单个  n受影响的数据 nModified修改了几条数据 ok:1 成功
User.updateOne({查询条件}, {要修改的值}).then(result => console.log(result))
//更新多个 查询条件为空{} 匹配所有
User.updateMany({查询条件}, {要更改的值}).then(result => console.log(result))

mongoose验证

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

  • required: true必传字段
  • minlength: 3字符串最小长度
  • maxlength: 20字符串最大长度
  • min: 2数值最小为2
  • max: 100数值最大为100
  • enum: [‘html’,’css’,’javascript’,’node.js’]
  • trim: true去除字符串两边的空格
  • validate: 自定义验证器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
const postSchema = new mongoose . Schema({
title: {
type: String,
//必选字段
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','js','node'],
message:'分类名称要在范围内才可以'
}
},
author:{
type:String,
// 自定义验证规则
validate:{
validator: v =>{
// 返回布尔值
// true/false 成功/失败
// v 要验证的值
return v && v.length > 4
},
// 自定义错误信息
message:'传入的值不符合验证规则'
}
}
});

获取错误信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const Post = mongoose . model( 'Post', I
postSchema) ;
Post.create( {title: ' aa '
age: 60, category: ' java',author: ' bd'})
then(result => console .1og( result) )
catch(error => {
I//获取错误信息对象
const
err =
error . errors ;
//循环错误信息对象
for (var attr
in err) {
//将错误信息打印到控制台中
console . log(err[attr][ ' message']);
}
})

集合关联

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

1
2
3
4
5
6
7
8
9
10
11
12
// 用户集合
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));

 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×