可以直接向一个不存在的数据仓库中插入文档(具体的数据),mongoDB会检查当前插入文档的数据库是否存在,如果不存在mongoDB会自动帮助我们去建立这个数据库。接下来介绍如何创建集合,因为我们向数据库中插入文档,插入的这个文档一定要属于某个集合(插入的这个文档一定要有一个类别),因而在插入文档之前要先去创建集合。
2.1 创建集合
在datatbase文件夹下新建02.js
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/playground', { useNewUrlParser: true })
.then(() => console.log('数据库连接成功'))
.catch(err => console.log(err, '数据库连接失败'));
// mongoose.Schema是mongoose对象下的构造函数,用于创建集合
//创建集合就是创建mongoose.Schema构造函数的实例对象
//用构造函数创建集合的同时,向构造函数传递一个对象作为参数
//这个对象里包含的属性就是集合中的文档可以包含的属性
//创建一个课程集合
//(1)创建集合规则
const courseSchema = new mongoose.Schema({
//以下字段是程序员自定义的
name: String,
author: String,
isPublished: Boolean
});
//(2)使用规则创建集合mongoose.model(集合名称【首字母大写】,该集合对应的规则);
//mongoose.model()方法的返回值是集合的构造函数
//构造函数Course中有很多方法可以让我们对集合进行操作
const Course = mongoose.model('Course', courseSchema);
运行02.js
到此为止运行02.js后,compass软件中还是看不到数据库playground。原因:只有插入数据compass中才会出现数据库playground
2.2 创建文档
1 方法1
//02.js
//连接数据库
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/playground', { useNewUrlParser: true })
.then(() => console.log('数据库连接成功'))
.catch(err => console.log(err, '数据库连接失败'));
// mongoose.Schema是mongoose对象下的构造函数,用于创建集合
//创建集合就是创建mongoose.Schema构造函数的实例对象
//用构造函数创建集合的同时,向构造函数传递一个对象作为参数
//这个对象里包含的属性就是集合中的文档可以包含的属性
//创建一个课程集合
//(1)创建集合规则
const courseSchema = new mongoose.Schema({
//以下字段是程序员自定义的
name: String,
author: String,
isPublished: Boolean
});
//(2)使用规则创建集合mongoose.model(集合名称【首字母大写】,该集合对应的规则);
//mongoose.model()方法的返回值是集合的构造函数
//构造函数Course中有很多方法可以让我们对集合进行操作
const Course = mongoose.model('Course', courseSchema);
//创建文档
//就是创建集合构造函数的实例
const course = new Course({ //course就是我们要插入的数据
name: 'node.js基础',
author: '黑马讲师',
isPublished: true
});
//将数据course插入到数据库中
course.save();
运行
2 方法2
在database目录下新建文件,名为03.js(node文件在取文件名的时候最好不要中文,所以这里以01,02,03的方式取名字,再建立一个文件清单.txt用于说明每个文件的作用)
//连接数据库
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/playground', { useNewUrlParser: true })
.then(() => console.log('数据库连接成功'))
.catch(err => console.log(err, '数据库连接失败'));
//创建集合
const courseSchema = new mongoose.Schema({
name: String,
author: String,
isPublished: Boolean
});
//Course是构造函数
const Course = mongoose.model('Course', courseSchema);
//创建文档
// const course = new Course({ //course就是我们要插入的数据
// name: 'node.js基础',
// author: '黑马讲师',
// isPublished: true
// });
// course.save();
//Course.create方法中第一个参数是要插入的数据,第二个参数是回调函数
Course.create({ name: 'javascript', author: '黑马讲师', isPublished: false }, (err, result) => {
console.log(err);
console.log(result);
})
运行
说明:对于数据库的所有操作都是异步操作,在mongoose中所提供的API支持两种获取异步API结果的方式
- 通过回调函数的方式获取异步API的执行结果
- mongoose提供的API也支持promise方式
对于promise方式说明如下,可以将代码
//Course.create方法中第一个参数是要插入的数据,第二个参数是回调函数
Course.create({ name: 'javascript', author: '黑马讲师', isPublished: false }, (err, result) => {
console.log(err);
console.log(result);
})
修改为
Course.create({ name: 'javascript', author: '黑马讲师', isPublished: false })
.then(doc => console.log(doc))
.catch(err => console.log(err));
运行后:
注意:就算是同一个js文件运行多次,那么在集合中也会重复插入多条相同的数据。
2.3 数据库导入数据
将现成的数据插入到文档中需要用到mongoDB数据库为我们提供的一个命令:
mongoimport -d 数据库名 -c 集合名称 --file要导入的数据文件
命令行工具回去计算机当中查找mongoimport这个命令的可执行文件,目前是找不到的
该命令使用前的准备工作:找到mongoDB的安装目录,将安装目录下的bin目录放置在环境变量中
(1)复制mongoimport.exe的目录C:Program FilesMongoDBServer4.2in
(2)此电脑(右键属性)-->系统高级设置--->环境变量--->系统环境变量中选择path后点击编辑--->点击新建。之后将刚才的路径粘贴进去。
(3)一路确定后,关闭当前的控制面板
(4)测试:重新打开命令行工具,将事先准备好的user.json文件导入
2.4 查询文档
从数据库中查询文档
- 集合的构造函数Course下有一个Course.find()方法用于查询文档,默认情况下用于查询集合所有的文档,
- Course.find()返回promise对象,可以调用then方法返回查找的结果result
- result是一个数组,数组中包含多个对象,多个对象就是通过find方法查询出来的文档,所以说find方法返回的是文档的集合
1 查询文档playground下的users集合中的文档:
// 引入mongoose第三方模块 用来操作数据库
const mongoose = require('mongoose');
// 数据库连接
mongoose.connect('mongodb://localhost/playground', { useNewUrlParser: true })
.then(() => console.log('数据库连接成功'))
.catch(err => console.log(err, '数据库连接失败'));
// 创建集合
const userSchema = new mongoose.Schema({
name: String,
age: Number,
email: String,
password: String,
hobbies: [String]
});
const User = mongoose.model('User', userSchema);
// 查询用户集合中的所有文档
User.find().then(result => console.log(result));
运行之后:
2 find可以根据条件查询文档
// 通过_id字段查找文档
User.find({_id: '5c09f267aeb04b22f8460968'}).then(result => console.log(result))
通过find方法去查询,无论查询的数据有多少,返回的都是数组
3 findeOne查找文档(返回的是对象)
// findOne方法返回一条文档 默认返回当前集合中的第一条文档
User.findOne().then(result => console.log(result))
4 findOne可以根据条件查询文档
// findOne方法返回一条文档 默认返回当前集合中的第一条文档
User.findOne({name: '李四'}).then(result => console.log(result))
5 匹配大于小于
// 查询用户集合中年龄字段大于20并且小于40的文档
//$gt是大于;$lt是小于
User.find({ age: { $gt: 20, $lt: 40 } }).then(result => console.log(result))
6 匹配包含
// 查询用户集合中hobbies字段值包含足球的文档
//$in是包含
User.find({ hobbies: { $in: ['足球'] } }).then(result => console.log(result))
7 选择要查询的字段
// 选择要查询的字段
// 多个字段用空格隔开
//不想查询的字段前面加上-,比如_id字段是字段查询出来的,如果不想查询就写成-_id
User.find().select('name email -_id').then(result => console.log(result))
8 对查询出来的数据进行排列
// 根据年龄字段对所有的数据进行升序排列
User.find().sort('age').then(result => console.log(result))
// 根据年龄字段进行降序排列
User.find().sort('-age').then(result => console.log(result))
9 skip跳过多少条数据;limit限制查询数量
// 查询文档跳过前两条结果 限制显示3条结果
User.find().skip(2).limit(3).then(result => console.log(result))
2.5 删除文档
1 删除一个文档
findOneAndDelete({})里面的参数是对象的形式,指定条件删除文档
如果查询添加包含多条文档,那么会将第一个匹配的文档进行删除
findOneAndDelete()返回的是一个promise对象,所以可以通过then方法拿到API执行的结果(结果指的是被删除的文档)
// 引入mongoose第三方模块 用来操作数据库
const mongoose = require('mongoose');
// 数据库连接
mongoose.connect('mongodb://localhost/playground', { useNewUrlParser: true })
.then(() => console.log('数据库连接成功'))
.catch(err => console.log(err, '数据库连接失败'));
// 创建集合
const userSchema = new mongoose.Schema({
name: String,
age: Number,
email: String,
password: String,
hobbies: [String]
});
const User = mongoose.model('User', userSchema);
//查找到一条文档并删除
//返回删除的文档
//如果查询条件匹配了多个文档 那么将会删除第一个匹配的文档
User.findOneAndDelete({ _id: '5c09f267aeb04b22f8460968' }).then(res => console.log(res));
运行
之后打开compass,会发现该数据已经被删除
2 删除多个文档
// 引入mongoose第三方模块 用来操作数据库
const mongoose = require('mongoose');
// 数据库连接
mongoose.connect('mongodb://localhost/playground', { useNewUrlParser: true })
.then(() => console.log('数据库连接成功'))
.catch(err => console.log(err, '数据库连接失败'));
// 创建集合
const userSchema = new mongoose.Schema({
name: String,
age: Number,
email: String,
password: String,
hobbies: [String]
});
const User = mongoose.model('User', userSchema);
//删除Users集合中的所有文档
User.deleteMany({}).then(res => console.log(result))
运行
之后user中的数据全部删除
2.6 更新文档
1 更新单个文档
返回结果是一个对象,包含了是否修改成功的信息。
// 引入mongoose第三方模块 用来操作数据库
const mongoose = require('mongoose');
// 数据库连接
mongoose.connect('mongodb://localhost/playground', { useNewUrlParser: true })
.then(() => console.log('数据库连接成功'))
.catch(err => console.log(err, '数据库连接失败'));
// 创建集合
const userSchema = new mongoose.Schema({
name: String,
age: Number,
email: String,
password: String,
hobbies: [String]
});
const User = mongoose.model('User', userSchema);
//更新集合中的文档
//如果匹配了多个文档,最终更新的也只是第一个匹配的文档
User.updateOne({ name: '李四' }, { name: 'lisa' }).then(res => console.log(res));
运行
打开campass,李四被更新成lisa
2 更新多个文档
// 引入mongoose第三方模块 用来操作数据库
const mongoose = require('mongoose');
// 数据库连接
mongoose.connect('mongodb://localhost/playground', { useNewUrlParser: true })
.then(() => console.log('数据库连接成功'))
.catch(err => console.log(err, '数据库连接失败'));
// 创建集合
const userSchema = new mongoose.Schema({
name: String,
age: Number,
email: String,
password: String,
hobbies: [String]
});
const User = mongoose.model('User', userSchema);
// User.updateOne({ name: '李四' }, { name: 'lisa' }).then(res => console.log(res));
//传空对象就说明要更改所有文档
//将所有文档中的age改成16
User.updateMany({}, { age: 16 }).then(res => console.log(res));
运行
之后打开campass会发现所有的文档的age都被修改为16