• mongodb和mongoose


    录:

    1、安装及配置mongodb
    2、启动服务时可以指定db的路径和端口
    3、基本概念
    4、基本指令
    5、数据库的CRUD(增删改查)的操作
    6、安装图形化工具
    7、文档之间的关系
    8、sort和投影
    9、mongoose
    10、通过mongoose连接MongoDB
    11、mongoose之Schema和Model
    12、mongoose的增加,查询方法
    13、mongoose的Document对象

    1、安装及配置mongodb    <--返回目录

      1)下载安装包:mongodb-win32-x86_64-2008plus-ssl-3.2.4-signed.msi

      2)配置path

      3)cmd 执行 mongod命令

      4)在d盘新建 data/db 目录

      5)cmd 执行mongod命令,启动服务,出现提示:waiting for connections on port 27017; 不要关闭该窗口

      6)新开一个cmd窗口,执行mongo命令,连接服务

    2、启动服务时可以指定db的路径和端口    <--返回目录

      mongod --dbpath d:xxxdatadb --port 10086

      

    3、基本概念    <--返回目录
      1) 数据库(database)
      2) 集合(collection)
      3) 文档(document)
      在MongoDB中,数据库和集合都不需要手动创建,当我们创建文档时,如果文档所在的集合或数据库不存在会自动创建数据库和集合

    4、基本指令    <--返回目录
            show dbs
            show databases
                - 显示当前的所有数据库
            use 数据库名
                - 进入到指定的数据库中
            db
                - db表示的是当前所处的数据库
            show collections
                - 显示数据库中所有的集合

    5、数据库的CRUD(增删改查)的操作    <--返回目录

      向数据库中插入文档 insert, insertOne, inserMany

    - 向集合中插入一个文档 db.<collection>.insert(doc)
    - 例子:向test数据库中的,stu集合中插入一个新的学生对象{name:"xxx", age:20, gender:"男"}
           db.stu.insert({name:"xxx",age:20, gender:"男"})

    - 插入多个文档
    - db.stu.insert([{name:"xxx",age:20, gender:"男"}, {...}])

      查询集合中的所有的文档

    db.<collection>.find()

       条件查询 find 返回一个数组, findOne 返回一个文档对象

    db.<collection>.find({name: 'xxx'})
    db.<collection>.find({age: {$gt: 10}})

      统计count

    db.<collection>.find().count()

      修改 update默认只更新一条记录(默认同updateOne), updateOne, updateMany

    /* 默认情况下会使用新对象来替换旧对象 */
    db.stu.update({gender: ''},{gender: 'male'})
    /* 修改指定字段 */
    db.stu.update({gender: ''},{$set: {gender: 'male'}})

      删除 remove(默认同deleteMany), deleteOne, deleteMany

    /* 删除多个 */
    db.stu.remove({gender: ''})
    /* 删除一个 */
    db.stu.remove({gender: 'xx'}, true)
    /* 删除所有,清空集合 */
    db.stu.remove({})
    /* 删除集合 */
    db.stu.drop()

      

    6、安装图形化工具    <--返回目录

      安装包:mongodbmanagerfree_inst.exe 或 studio-3t-x64.msi

    7、文档之间的关系    <--返回目录

      一对一(one to one): 在MongoDB,可以通过内嵌文档的形式来体现出一对一的关系

    db.wifeAndHusband.insert([
        {
            name:"黄蓉",
            husband:{
                name:"郭靖"
            }
        }, {...}
    ]);

      一对多(one to many)或多对一(many to one)

    db.users.insert([{_id:1, username:"zs1"},{_id:2, username:"zs2"}]);
    
    db.order.insert({ 
        list:["牛肉","漫画"],
        user_id: 1
    });
    
    db.users.find()
    db.order.find()

      多对多(many to many)

    db.teachers.insert([
        {name:"洪七公"},
        {name:"黄药师"},
        {name:"龟仙人"}
    ]);
    
    db.stus.insert([
        {
            name:"郭靖",
            tech_ids:[
                ObjectId("59c4806d241d8d36a1d50de4"),
                ObjectId("59c4806d241d8d36a1d50de5")
            ]
        },{
            name:"孙悟空",
            tech_ids:[
                ObjectId("59c4806d241d8d36a1d50de4"),
                ObjectId("59c4806d241d8d36a1d50de5"),
                ObjectId("59c4806d241d8d36a1d50de6")
            ]
        }
    ])
    
    db.teachers.find()
    
    db.stus.find()

     8、sort和投影    <--返回目录

    //查询文档时,默认情况是按照_id的值进行排列(升序)
    //sort()可以用来指定文档的排序的规则,sort()需要传递一个对象来指定排序规则 1表示升序 -1表示降序
    //limit skip sort 可以以任意的顺序进行调用
    db.emp.find({}).sort({sal:1,empno:-1});
    
    //在查询时,可以在第二个参数的位置来设置查询结果的 投影,指定查询的字段
    db.emp.find({},{ename:1 , _id:0 , sal:1}); // 1查询,0不查询

    9、mongoose    <--返回目录

      mongoose中为我们提供了几个新的对象
            – Schema(模式对象): Schema对象定义约束了数据库中的文档结构
            – Model: Model对象作为集合中的所有文档的表示,相当于MongoDB数据库中的集合collection
            – Document: Document表示集合中的具体文档,相当于集合中 的一个具体的文档

    10、通过mongoose连接MongoDB    <--返回目录

      使用Mongoose必须先安装mongoose包: npm install mongoose
      加载Mongoose: const mongoose = require("mongoose")
      连接数据库: mongoose.connect("mongodb://127.0.0.1/test", { useMongoClient: true })
      断开连接: mongoose.disconnect()

    const mongoose = require("mongoose")
    // WARNING: The `useMongoClient` option is no longer necessary in mongoose 5.x, please remove it.
    // mongoose.connect("mongodb://127.0.0.1/test", { useMongoClient: true })
    mongoose.connect("mongodb://127.0.0.1/test")
    
    mongoose.connection.once('open', function() {
        console.log('mongodb连接成功。。。')
    })
    
    mongoose.connection.once('close', function() {
        console.log('mongodb断开连接。。。')
    })
    
    mongoose.disconnect()

    11、mongoose之Schema和Model    <--返回目录

    const mongoose = require("mongoose")
    mongoose.connect("mongodb://127.0.0.1/test")
    
    mongoose.connection.once('open', function() {
        console.log('mongodb连接成功。。。')
    })
    
    const Schema = mongoose.Schema
    // 创建Schema对象
    const stuSchema = new Schema({
        name: String,
        age: Number,
        gender: {
            type: String,
            default: 'male'
        },
        address: String
    })
    
    // 通过Schema创建Model
    // Model代表的是数据库中的集合,通过Model才能操作数据库
    const stuModel = mongoose.model("stu", stuSchema)
    
    // 向数据库中插入一个文档
    stuModel.create({
        name: '张三',
        age: 10,
        gender: 'male',
        address: '中国广东省深圳市'
    }, function(err) {
        if (!err) console.log('插入成功...')
        throw err
    })

    12、mongoose的增加,查询方法    <--返回目录

    const mongoose = require("mongoose")
    mongoose.connect("mongodb://127.0.0.1/test")
    
    mongoose.connection.once('open', function () {
        console.log('mongodb连接成功。。。')
    })
    
    const Schema = mongoose.Schema
    // 创建Schema对象
    const stuSchema = new Schema({
        name: String,
        age: Number,
        gender: {
            type: String,
            default: 'male'
        },
        address: String
    })
    
    // 通过Schema创建Model
    // Model代表的是数据库中的集合,通过Model才能操作数据库
    const stuModel = mongoose.model("stu", stuSchema)
    
    // 向数据库中插入一个文档
    stuModel.create({
        name: '张三1',
        age: 10,
        gender: 'male',
        address: '中国广东省深圳市'
    }, function (err, doc) {
        if (!err) {
            console.log('插入成功...')
            console.log(doc)
            console.log('主键返回,_id:', doc._id)
        } else {
            throw err
        }
    })
    
    // find查询: 结果集是数组
    // stuModel.find({name: '张三'}, function(err, docs) {
    //     if(!err) {
    //         console.log(docs[0].name)
    //         console.log(docs)
    //     }
    // })
    // findOne查询:结果集是对象
    // stuModel.findOne({name: '张三'}, function(err, doc) {
    //     if(!err) {
    //         console.log(doc.name)
    //         console.log(doc)
    //     }
    // })
    
    // findByIde查询:结果集是对象
    // stuModel.findById('5e3bd96d1ac8060958762b6a', function(err, doc) {
    //     if(!err) {
    //         console.log(doc.name)
    //         console.log(doc)
    //     }
    // })
    
    // 第二参数:投影,即需要查询的字段
    // stuModel.find({name: '张三'}, {name: 1, age:1, _id: 0}, function(err, docs) {
    //     if(!err) {
    //         console.log(docs[0].name)
    //         console.log(docs)
    //     }
    // })
    stuModel.find({ name: '张三' }, 'name age -_id', function (err, docs) {
        if (!err) {
            console.log(docs[0].name)
            console.log(docs)
        }
    })
    const mongoose = require("mongoose")
    mongoose.connect("mongodb://127.0.0.1/test")
    
    mongoose.connection.once('open', function () {
        console.log('mongodb连接成功。。。')
    })
    
    const Schema = mongoose.Schema
    // 创建Schema对象
    const stuSchema = new Schema({
        name: String,
        age: Number,
        gender: {
            type: String,
            default: 'male'
        },
        address: String
    })
    
    // 通过Schema创建Model
    // Model代表的是数据库中的集合,通过Model才能操作数据库
    const stuModel = mongoose.model("stu", stuSchema)
    
    stuModel.updateOne({ name: '张三' }, {$set: {age: 100}}, function (err, result) {
        if (!err) {
            console.log(result) // {ok: 1, nModified: 0, n: 1}
        }
    })
    
    stuModel.deleteOne({ name: '张三' }, function (err, result) {
        if (!err) {
            console.log(result) // {ok: 1, n: 1, deleteCount: 1}
        }
    })
    
    stuModel.count({ name: '张三1' }, function (err, result) {
        if (!err) {
            console.log(result)  // 3
        }
    })

    13、mongoose的Document对象    <--返回目录

      Document与集合中的文档对应,Document是Model的实例,通过Model查询到的结果都是Document

      save()方法

    const mongoose = require("mongoose")
    mongoose.connect("mongodb://127.0.0.1/test")
    
    mongoose.connection.once('open', function () {
        console.log('mongodb连接成功。。。')
    })
    
    const Schema = mongoose.Schema
    // 创建Schema对象
    const stuSchema = new Schema({
        name: String,
        age: Number,
        gender: {
            type: String,
            default: 'male'
        },
        address: String
    })
    
    // 通过Schema创建Model
    // Model代表的是数据库中的集合,通过Model才能操作数据库
    const stuModel = mongoose.model("stu", stuSchema)
    
    const stu = new stuModel({
        name: 'zs',
        age: 30,
        gender: 'male',
        address: 'xxx'
    })
    /* 打印结果
      stu:  { gender: 'male',
      _id: 5e3bf0b7e77e9411fcfe3963,
      name: 'zs',
      age: 30,
      address: 'xxx' }
    */
    console.log('stu: ', stu)
    stu.save(function (err, result) {
        if (!err) {
            console.log('保存成功...')
            console.log('result: ', result)
        }
    })
    /*
      result:  { gender: 'male',
      _id: 5e3bf0b7e77e9411fcfe3963,
      name: 'zs',
      age: 30,
      address: 'xxx',
      __v: 0 }
    */

      update()方法和remove()方法

    const mongoose = require("mongoose")
    mongoose.connect("mongodb://127.0.0.1/test")
    
    mongoose.connection.once('open', function () {
        console.log('mongodb连接成功。。。')
    })
    
    const Schema = mongoose.Schema
    // 创建Schema对象
    const stuSchema = new Schema({
        name: String,
        age: Number,
        gender: {
            type: String,
            default: 'male'
        },
        address: String
    })
    
    // 通过Schema创建Model
    // Model代表的是数据库中的集合,通过Model才能操作数据库
    const stuModel = mongoose.model("stu", stuSchema)
    
    const stu = new stuModel({
        name: 'zs',
        age: 30,
        gender: 'male',
        address: 'xxx'
    })
    
    stuModel.findById('5e3bf0b7e77e9411fcfe3963', function(err, doc) {
        if (!err) {
            console.log('查询成功, doc: ', doc)
            console.log('doc instanceof stuModel: ', doc instanceof stuModel) // true
    
            doc.update({name: 'zs111'}, function(err, result) {
                if (!err) {
                    console.log('更新成功, result: ', result)
                }
            })
        }
    })
    
    stuModel.findById('5e3bf0b7e77e9411fcfe3963', function(err, doc) {
        if (!err) {
            console.log('查询成功, doc: ', doc)
            console.log('doc instanceof stuModel: ', doc instanceof stuModel) // true
    
            doc.remove(function(err, result) {
                if (!err) {
                    console.log('删除成功, result: ', result)
                }
            })
        }
    })

       另一种修改方式:

    stuModel.findById('5e3be238816b4f69242071da', function(err, doc) {
        if (!err) {
            console.log('查询成功, doc: ', doc)
            console.log('doc instanceof stuModel: ', doc instanceof stuModel) // true
    
            // doc.update({name: 'zs111'}, function(err, result) {
            //     if (!err) {
            //         console.log('更新成功, result: ', result)
            //     }
            // })
    
            doc.name = 'test'
            doc.save()
        }
    })

    ---

  • 相关阅读:
    《SRE实战手册》学习笔记之切入SRE
    dev c++ 无法单步调试
    value demand improvement plan
    uds/obd刷euc ipmsg rpmsg udsmsg can msg
    monitor
    AcWing 97. 约数之和
    【JDBC】PrepareStatement的占位符不可用于表名、字段名,只可用于参数
    【Java线程】借用杜琪峰《黑社会之龙城岁月》之人物活动诠释CyclicBarrier作用
    【java线程】生成有限生产,且待消费者消费完全部消息后,生产者消费者相继退出的现实模式
    【脱敏迁移】两种脱敏迁移模式的再思考
  • 原文地址:https://www.cnblogs.com/xy-ouyang/p/12258040.html
Copyright © 2020-2023  润新知