• 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

  • 相关阅读:
    java类研究(String)
    webservices
    LoadRunner(软件性能测试工具)
    java线程
    lucene solr
    java IO
    实现一个可变长数组
    [北大程序设计与算法]--虚函数与多态的实例
    A1155 Heap Paths [堆的dfs]
    A1154 Vertex Coloring
  • 原文地址:https://www.cnblogs.com/deer-cen/p/12574108.html
Copyright © 2020-2023  润新知