Node学习笔记 Mongodb和Mongoose

关系型数据库 和 非关系型数据库

  • 关系型数据库

    • 最典型的数据结构是表
    • 关系型数据库是由二维表及其之间的联系所组成的一个数据组织
    • 都需要使用 SQL 语言操作
    • ……
  • 非关系型数据库

    • 严格上不是一种数据库,没有 的概念,是一种数据结构化存储方法的集合
    • 数据结构由键值 (key => value) 对组成,类似于 JSON 对象
    • 在非关系型数据库中,集合 相当于 文档对象 相当于 表记录
    • ……

MongoDB 介绍

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

MongoDB 安装

安装文件下载地址:[https://www.mongodb.com/download-center/community]

Windows 平台安装 MongoDB:https://www.runoob.com/mongodb/mongodb-window-install.html

在安装过程中需要特别注意,需要将 Install MongoDB Compass 前默认的勾选取消

可以使用 mongod --version 命令查看 MongoDB 版本,若版本号输出正常则安装完毕

MongoDB 使用

  • 启动数据库

    mongodb
    

    默认情况下,通过命令启动的数据库目录在 命令执行所在盘符根目录 /data/db 文件

    通过 ctrl + c关闭命令行窗口 可以关闭服务器(在程序操作过程中请不要关闭该命令行窗口)

    mongod --dbpath = '数据库自拟路径'
    

    通过以上命令可以修改默认数据库路径

  • 使用默认端口来连接 MongoDB 服务

    mongodb
    
  • 显示所有已存在的数据库

    show dbs
    

    在显示的结果中 adminlocal 两个结果为系统数据库

  • 切换到目标数据库

    use demo
    

    通过命令 use + 目标数据库名 ,既可切换到目标数据库

  • 查看当前操作数据库

    db
    

    通过 db 命令可以查看当前操作的数据库

    这里需要注意的是,当数据库中没有数据时,数据库不予显示

  • 显示当前数据库的所有集合

    show collections
    

    查看当前 db 数据库中存在的所有集合

    这里需要注意的是,当集合中没有数据时,合集不予显示

  • 显示当前集合中所有数据

    db.students.find()
    

    通过 db. + 当前集合名称 + .find() 可以查看当前集合中的所有数据

  • 向当前集合添加数据

    db.students.insertOne({name: 'demo'})
    

    通过 db. + 当前集合名称 + .insertOne({ + 数据对象 + }) 可以向当前集合中添加数据

  • 断开 MongoDB 服务

    exit
    

Mongoose 介绍

Mongoose 是在 node.js 异步环境下对 mongodb 进行便捷操作的对象模型工具

Mongoose 安装

npm install mongoose

Mongoose 使用

var mongoose = require('mongoose'); // 引入 mongoose
mongoose.connect('mongodb://localhost/test'); // 通过 mongoose 连接 mongodb 数据库

连接数据库的默认端口为 27017

.connect 中返回一个状态待定(pending)的连接, 可供我们对连接成功与否进行监测

var db = mongoose.connection; // 数据库连接状态
db.on('error', console.error.bind(console, 'connection error:')); // 数据库连接失败
db.once('open', function() {
  // we're connected!(数据库连接成功)
});

.on 的第一个参数可选值为 connectederrordisconnected ,分别用于监测 连接成功、链接异常、链接断开

创建模型,设计数据库

var kittySchema = mongoose.Schema({
  name: String,
  // 也可以如下写法
  name: {
    type: String, // 数据类型
    required: Boolean, // 是否为必须
    defaule: '张三', // 默认值
    enum: ['张三', '李四', '王五', '赵六'] // 枚举,默认值只可是枚举值
  }
}
});
var Kitten = mongoose.model('Kitten', kittySchema);

mongoose.model 用于将一个数据库模型发布为 model

以上代码中,相当于创建了一个名为 Kitten 的集合,该集合内部的数据结构中有一条数据名为 name ,且是 字符串 类型

使用 Kitten 以下代码创造一条数据

var felyne = new Kitten({ name: 'Felyne' });

此时,集合 Kitten 中会增加一条 nameFelyne 的数据,Felyne 的数据类型为 String

通过 .save 方法可以验证数据是否保存成功

fluffy.save(function (err, fluffy) {
    if (err) return console.error(err);
    fluffy.speak();
});

注意 回调函数的第一个参数永远是 error

  • 增加数据

    Model.save([fn])

    var user = new User({
      username: 'kongzhi0707',
      password: '123456'
    });
    user.save(function(err, res) {
      if (err) {
          return console.log(err);
      }  
      console.log(res);
    });
    
  • 删除数据

    1. 从集合中删除所有符合条件的文档:Model.remove(conditions, [callback])

      conditions:Object

      [callback]:Function

      示例:

      var wherestr = {'username': 'kongzhi0707'}; // 删除数据的条件
      User.remove(wherestr, function(err, res) {
        if (err) {
            return console.log(err);
        }  
        console.log(res);
      });
      
    2. 查找匹配符合 id 的文档,将其删除:Model.findByIdAndRemove(id, [options], [callback])

      id:Object|Number|String

      [options]:Object

      ​ sort:如果条件找到多个文档,请设置排序顺序以选择要更新的文档

      ​ select:设置要返回的文档字段

      ​ rawResult:如果为 true ,则返回 MongoDB 驱动程序的原始结果

      ​ strict:覆盖此更新的架构的严格模式选项

      [callback]:Function

      示例:

      User.findByIdAndRemove(id, options, callback) // executes
      User.findByIdAndRemove(id, options)  // return Query
      User.findByIdAndRemove(id, callback) // executes
      User.findByIdAndRemove(id) // returns Query
      User.findByIdAndRemove()           // returns Query
      
    3. 根据记录 :Model.findOneAndRemove(conditions, [options], [callback])

      conditions:Object

      [options]:Object

      ​ sort:如果条件找到多个文档,请设置排序顺序以选择要更新的文档

      ​ maxTimeMS:对查询设置时间限制

      ​ select:设置要返回的文档字段

      ​ rawResult:如果为 true ,则返回 MongoDB 驱动程序的原始结果

      ​ strict:覆盖此更新的架构的严格模式选项

      [callback]:Function

      示例:

      User.findOneAndRemove(conditions, options, callback) // executes
      User.findOneAndRemove(conditions, options)  // return Query
      User.findOneAndRemove(conditions, callback) // executes
      User.findOneAndRemove(conditions) // returns Query
      User.findOneAndRemove()           // returns Query
      
  • 更新数据

    1. 根据条件更新数据库中的一个文档:Model.update(conditions, doc, [options], [callback])

      conditions:Object

      doc:Object

      [options]:Object

      ​ safe:(布尔值)安全模式(默认为在架构(true)中设置的值)

      ​ upsert:(布尔值)是否创建不匹配的文档(假)

      ​ multi:(布尔值)是否应更新多个文档(假)

      ​ runValidators:如果为 true ,则对此命令运行更新验证程序。更新验证器根据模型的架构验证更新操作

      ​ setDefaultsOnInsert:如果 this 和 upsert 为 true ,则在创建新文档时,猫鼬将应用模型模式中指定的默认值(此选项仅在MongoDB >= 2.4上有效)

      ​ strict:(布尔值)会覆盖此更新的严格选项

      ​ overwrite:(布尔值)禁用仅更新模式,从而允许您覆盖文档(false)

      [callback]:Function

      示例:

      var wherestr = {'username': 'kongzhi0707'}; // 更新数据的条件查询
      var updatestr = {'password': 'abcdef'}; // 执行更新数据
      User.update(wherestr, updatestr, function(err, res) {
        if (err) {
            return console.log(err);
        }  
        console.log(res);
      });
      
    2. 通过文档的 _id 字段更新数据库中的一个文档 :Model.findByIdAndUpdate(id, [update], [options], [callback])

      id:Object|Number|String

      [update]:Object

      [options]:Object

      ​ new:bool-true,返回修改后的文档而不是原始文档(默认为 false )

      ​ upsert:bool-创建对象(如果不存在)(默认为false)

      ​ runValidators:如果为true,则对此命令运行更新验证程序。更新验证器根据模型的架构验证更新操作

      ​ setDefaultsOnInsert:如果 this 和 upsert 为 true ,则在创建新文档时,猫鼬将应用模型模式中指定的默认值(此选项仅在MongoDB >= 2.4上有效)

      ​ sort:如果条件找到多个文档,请设置排序顺序以选择要更新的文档

      ​ select:设置要返回的文档字段

      ​ rawResult:如果为true,则返回MongoDB驱动程序的原始结果

      ​ strict:覆盖此更新的架构的严格模式选项

      [options.lean]:Object

      [callback]:Function

      示例:

      User.findByIdAndUpdate(id, update, options, callback) // executes
      User.findByIdAndUpdate(id, update, options)  // returns Query
      User.findByIdAndUpdate(id, update, callback) // executes
      User.findByIdAndUpdate(id, update)           // returns Query
      User.findByIdAndUpdate()                     // returns Query
      
    3. 根据记录:Model.findOneAndUpdate([conditions], [update], [options], [callback])

      [conditions]:Object

      [update]:Object

      [options]:Object

      ​ new:bool-如果为true,则返回修改后的文档而不是原始文档(默认为false)

      ​ upsert:bool-创建对象(如果不存在)(默认为false)

      ​ fields:{Object | String} 等效于 .select(fields).findOneAndUpdate()

      ​ maxTimeMS:对查询设置时间限制-需要 mongodb >= 2.6.0

      ​ sort:如果条件找到多个文档,请设置排序顺序以选择要更新的文档

      ​ runValidators:如果为 true ,则对此命令运行更新验证程序。更新验证器根据模型的架构验证更新操作

      ​ setDefaultsOnInsert:如果 this 和 upsert 为 true ,则在创建新文档时,猫鼬将应用模型模式中指定的默认值(此选项仅适用于MongoDB >= 2.4)

      ​ rawResult:如果为true,则返回MongoDB驱动程序的原始结果

      ​ strict:覆盖此更新的架构的严格模式选项

      [options.lean]:Object

      [callback]:Function

      示例:

      User.findOneAndUpdate(conditions, update, options, callback) // executes
      User.findOneAndUpdate(conditions, update, options)  // returns Query
      User.findOneAndUpdate(conditions, update, callback) // executes
      User.findOneAndUpdate(conditions, update)           // returns Query
      User.findOneAndUpdate()                             // returns Query
      
  • 查询数据

    1. 根据条件查找文件:Model.find(conditions, [fields], [options], [callback]);

      conditions:Object

      [projection]:Object

      [options]:Object

      [callback]:Function

      示例:

      var wherestr = {'userName': '龙恩0707'}; // 删除数据的条件
      User.find(wherestr, function(err, res) {
      if (err) {
            return console.log(err);
      }  
        console.log(res);
      });
      
    2. 通过其 _id 字段查找单个文档:Model.findById(id, [projection], [options], [callback])

      id:Object|String|Number

      [projection]:Object

      [options]:Object

      [callback]:Function

      示例:

      Adventure.findById(id, function (err, adventure) {}); // find adventure by id and execute immediately
        
      Adventure.findById(id).exec(callback); // same as above
      
      Adventure.findById(id, 'name length', function (err, adventure) {}); // select only the adventures name and length
      
      Adventure.findById(id, 'name length').exec(callback); // same as above
      
      Adventure.findById(id, '-length').exec(function (err, adventure) {}); // include all properties except for `length`
      
      Adventure.findById(id, 'name', { lean: true }, function (err, doc) {}); // passing options (in this case return the raw js objects, not mongoose documents by passing `lean`
      
      Adventure.findById(id, 'name').lean().exec(function (err, doc) {}); // same as above
      
    3. 根据记录:Model.findOne([conditions], [projection], [options], [callback])

      id:Object|String|Number

      [projection]:Object

      [options]:Object

      [callback]:Function

      示例:

      Adventure.findById(id, function (err, adventure) {}); // find adventure by id and execute immediately
      
      Adventure.findById(id).exec(callback); // same as above
      
      Adventure.findById(id, 'name length', function (err, adventure) {}); // select only the adventures name and length
      
      Adventure.findById(id, 'name length').exec(callback); // same as above
      
      Adventure.findById(id, '-length').exec(function (err, adventure) {}); // include all properties except for `length`
      
      Adventure.findById(id, 'name', { lean: true }, function (err, doc) {}); // passing options (in this case return the raw js objects, not mongoose documents by passing `lean`
      
      Adventure.findById(id, 'name').lean().exec(function (err, doc) {}); // same as above
      
    4. 范围查询:

      User.find({userage: {gte: 21,lte: 65}}, callback); //这表示查询年龄大于等21而且小于等于65岁
      

      可用的部分类似范围查询条件还有:

      $or:或关系 $nor:或关系取反 $gt:大于 $gte:大于等于

      $lt: 小于 $lte:小于等于 $ne:不等于 $in:在多个值范围内

      $nin:不在多个值范围内 $all:匹配数组中多个值 $regex:正则,用于模糊查询

      $size:匹配数组大小 $maxDistance:范围查询,距离(基于LBS)

      $mod:取模运算 $near:邻域查询,查询附近的位置(基于LBS)

      $exists:字段是否存在 $elemMatch:匹配内数组内的元素

      $within:范围查询(基于LBS) $box:范围查询,矩形范围(基于LBS)

      $center:范围醒询,圆形范围(基于LBS) $centerSphere:范围查询,球形范围(基于LBS)

      $slice:查询字段集合中的元素(比如从第几个之后,第N到第M个元素)


文章已同步我的个人博客:《Node学习笔记 Mongodb和Mongoose


资料参考:


本篇文章由一文多发平台ArtiPub自动发布

发布了16 篇原创文章 · 获赞 0 · 访问量 512

猜你喜欢

转载自blog.csdn.net/sz861128/article/details/103563453