zoukankan      html  css  js  c++  java
  • 【重学Node.js 第3篇】mongodb以及mongoose的使用

    mongodb以及mongoose的使用

    课程介绍看这里:https://www.cnblogs.com/zhangran/p/11963616.html
    项目github地址:https://github.com/hellozhangran/happy-egg-server

    mongodb

    mongodb是典型的非关系型数据库,关于它的背景介绍和优势劣势这里就不赘述,我们直接讲实操或者说最有可能用到的部分。

    mongodb常用指令

    • mongod --config /opt/mongodb/mongod.conf 启动mongod服务。
      • 如果想在后台启动,需要修改mongod.conf,添加fork=true,然后再启动。
      • 想关掉后台运行的mongod服务,先查看所有后台运行的服务 lsof -i,找到mongod的pid号,kill yourpid
    • mongo 进入 mongo 环境
    • show dbs 查看所有的数据库
    • use test 进入test数据库
    • db.createCollection('user') 创建一个user集合
      • 这里简单介绍一下集合的概念,mongo 是非关系型数据库,不存在表的概念,与表相对应的是集合。当然集合不是表,与表相差很大,没有表的行列结构,可以简单的把集合当成一个 list,而 list 里面会放一个个对象。有没有发现这像极了json数据格式。
    • db.user.insert({name: 'zhangsan', age: 21, sex: 'male'}) 在集合中插入一条数据
    • db.user.find() 查看集合user中的所有数据
    • db.user.find().pretty() 以一个漂亮点的格式显示数据
    • db.user.find({name: 'zhangsan'}) find的第一个参数是where选择条件,显示符合name='zhangsan'的整条数据
    • db.user.find({name: 'zhangsan'}, {name: 1}) find的第一个参数是指定显示内容,显示符合条件的name,1是显示,0是不显示。

    使用mongoose

    mongoose是一个nodejs工具库,方便使用nodejs操作mongodb

    1. 首先使用mongoose连接mongodb数据库

    const mongoose = require('mongoose');
    
    // 创建一个连接,并监听各种事件,在执行connect操作时,各事件会视具体情况而触发。
    mongoose.connection
    .on('error', function (err) {
        // 数据库连接失败时触发
        console.log('connect error: ', err);
    })
    .on('disconnected', function () {
        // 数据库断开时触发,断开重连的逻辑可以放在这里。
    })
    .once('open', function () {
        // 数据库连接成功时触发,express开启listen的逻辑可以放在这里。
    });
    
    // 启动mongod服务默认是运行在127.0.0.1上,所以下面路径是localhost
    // test是数据库名,如果有则连接,如果无则创建
    mongoose.connect('mongodb://localhost/test', {
        useNewUrlParser: true,
        useUnifiedTopology: true
    });
    
    

    2. Schema与Model

    在mongoose中Schema、Model是非常重要的概念。Model对应mongodb中的集合 collection,而Schema对应集合的结构,也就是结合都有哪些字段、字段的类型、是否必填、是否有缺省值等。

    const UserSchema = mongoose.Schema({
        name: String,
        age: Number,
        sex: Boolean
    });
    
    // Schema的静态方法
    UserSchema.statics.findUserByAge = function (age) {
        // 用then来拿到结果,如findUserByAge(21).then((res) => {})。
        // 也可以在find第二个参数传回调函数
        return this.find({'age': age});
    }
    
    // Schema的实例方法
    UserSchema.methods.findUserByName = function(name) {
        return this.model('User').find({ name: name });
    };
    
    // 创建一个Model,第三参数指定mongodb中collection的名字,如果不传则默认为变为复数(即Users)
    const User = mongoose.model('User', UserSchema, 'user');
    
    // 创建一条数据
    // 1. 直接用User创建
    User.create({name: 'zhangsan', age: 27, sex: true}, function(err, info) {
        console.log(info);
    });
    
    // 2. 新创建一个对象再添加数据到数据库
    // 再次说明下现在mongoose默认是支持promise方式的,可以使用then 或 回调函数的方式
    var person = new User({name: 'lisi', age: 20, sex: false});
    person.save().then(res => {
        console.log(res);
    })
    
    // 调用Schema中定义的静态方法,可以通过User直接调
    User.findUserByAge(21);
    
    // 调用Schema中定义的实例方法方法,先实例化再调
    const user = new User();
    user.findUserByName('zhangsan');
    
    // 删除数据,删除符合条件的一条
    User.deleteOne({name: 'lisi'}).then();
    
    // 删除符合条件的所有数据
    User.deleteMany({age: 20}).then();
    
    // 注意:remove()方法已经被弃用了!
    

    最后附上mongoose的api文档,其他的使用方法不一一列举:

    http://www.mongoosejs.net/docs/api.html

    TODO

    上面讲的是目前项目中已经用到的,后续可能会继续拓展的:

    • docker与mongodb
    • mongodb复制集之自动容灾
  • 相关阅读:
    document.getElementById("mytxt").style.left=""style.left在IE的FF中注意
    asp.net 用户控件中 使用相对路径的解决方法 图片路径问题(用户控件、图片路径) ,ResolveUrl
    探索 Block (一) (手把手讲解Block 底层实现原理)
    iOS 多线程开发 (概念与API简介)
    iOS 性能小点
    iOS runtime (二)(runtime学习之AutoCoding源码分析)
    探索 NSRunLoop (二)(NSRunLoop 自己动手实现SimpleRunLoop)
    iOS NSNotificationCenter (自己实现一个通知中心XMCNotificationCenter)
    iOS runtime (三)(runtime学习之YYModel源码分析)
    iOS runtime(一)(runtime 分析理解)
  • 原文地址:https://www.cnblogs.com/zhangran/p/12032266.html
Copyright © 2011-2022 走看看