Node开发--->10_Node.js_mongoDB增删改查操作

可以直接向一个不存在的数据仓库中插入文档(具体的数据),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

原文地址:https://www.cnblogs.com/deer-cen/p/12574108.html