资讯专栏INFORMATION COLUMN

vue2.0开发聊天程序(六) 搞定mongodb

Dr_Noooo / 1988人阅读

摘要:为安装文件,无需再配置环境变量。连接操作有以下包作者并未查到除此之外的包,但不代表没有。等于是每个默认配置的主键属性,属性名为可自己定义一个来覆盖此属性。需要注意的是,在新版本的文档中,为。通过创建限于篇幅,本小节暂时写到这里。

我的琴声呜咽,我的泪水全无。我把远方的远归还草原。
                   - 海子《九月》

mongodb安装

什么是Mongodb?
就是一个基于分布式文件存储的数据库,多的不说。

mongodb分了多个版本,Atlas【云版本】、Community Server【社区版本】、Enterprise Server【企业版本】......我选择了社区版本安装,Windows 7/Windows Server 2008 R2version v3.4.0
下载地址: https://www.mongodb.com/downl...

注意: 右上角红框可选择你想要的版本,分别为稳定版、早期版、开发板,左上角可选择对应版本集中的指定版本
可选择zip/tgz/msi三种资源格式,zip和tgz下载之后解压到对应目录,还需配置对应的环境变量。msi为安装文件,无需再配置环境变量。【本人采用msi,方便】

运行

安装完成之后,在mongodb目录下新建文件夹testMongodb打开cmd,输入

mongod --dbpath"D:mongodb	estMongodb"  

在浏览器访问http://localhost:27017/,显示如下,说明你不仅成功安装了Mongodb还开启了一个叫testMongodb的数据库。

总得来说,比起mySql,SOLserver用mongodb创建数据库和启动服务都简单许多。它就像新建了一个文件夹,在文件夹中分类存放了许多txt文件。你可以随时增加或者删除文件而不需要重启服务。

可视化界面工具 Robonmongo

Robonmongo是一个免费的轻量级的mongodb用户图形界面(GUI)。
官网下载地址:https://robomongo.org/

右上角Download,会出现多个版本。每个版本都有详细的版本说明,可选择一个你觉得合适的版本或者直接用最新版。

下载安装之后,在打开mongodb服务的情况下,输入mongodb服务器地址,即可连接到服务器。

可对数据进行你想做的任何操作,操作都很简单,这里就略过了

Node连接mongodb

node操作mongodb有以下npm包:
mongoose、mongodb、mongoskin、mongojs(作者并未查到除此之外的npm包,但不代表没有)。
哪一个更好?个人看法仅供参考:

1.mongodb: 官方版,但写起来太麻烦。
2.mongoskin:简单,但是相关文档太少,你甚至找不到实现联表查询的办法
3.mongojs:比mongodb好一点,但是同样文档太少让人极不满意
4.mongoose:目前最好用的MongoDB ORM,文档多(有官网),支持联表查询,而且还很规范

所以我选择 mongoose。http://mongoosejs.com/

mongoose简单搭建

本节只讲mongoose的基本概念和最基础的项目搭建。CRUD(也就是增删改查)的操作放在下一节。

简单开始

安装mongoose只需要install一下就好了

$ npm install mongoose --save

假设我们已经开启了一个testMongodb的mongodb服务,创建连接:

var mongoose = require("mongoose");  // 引入mongoose模块
mongoose.connect("mongodb://localhost/testMongodb");// 连接到数据库服务

var db = mongoose.connection;//connection创建连接的实例
db.on("error", console.error.bind(console, "connection error:")); // 注册连接失败的事件监听
db.once("open", function (callback) { // 注册连接成功的事件监听 once只触发一次
  // yay!
});

once方法继承自EventEmitter,EventEmitter是node事件触发与事件监听器功能的封装
到此,testMongodb还是一个空的数据库,连表都没有(为了方便理解collections解释为表)。

理解mongoose

要理解mongoose就要先理解下面三个名词:
Schema: 一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力
Model:由Schema发布生成的模型,具有抽象属性和行为的数据库操作对
Entity:由Model创建的实体,他的操作也会影响数据库

一句话概括:用Schema创建一个数据库表骨架,通过这个表骨架生成一个可操作的MOdel,这个Model可以创建对应的实体Entity,Entity即一条可操作的数据,它们都是Object

便于理解可将Schema看做一张设计图,MOdel是根据设计图制造出来的模具,Entity就是模具做出来的物体。

Schema

定义一个Schema

var PersonSchema = new mongoose.Schema({
      name:String   //定义一个属性name,类型为String
    });

Schema.Type

Schema.Type是由Mongoose内定的一些数据类型,基本数据类型都在其中,他也内置了一些Mongoose特有的Schema.Type。支持自定义schema.type。

Schema.type有一下常见的类型:

 //举例:
    var ExampleSchema = new Schema({
      name:String,
      binary:Buffer, //以字节的形式操作文件
      living:Boolean,
      updated:Date,
      age:Number,
      mixed:Schema.Types.Mixed, //该混合类型等同于nested
      _id:Schema.Types.ObjectId,  //主键
      _fk:Schema.Types.ObjectId,  //外键
      array:[],
      arrOfString:[String], // 数据类型只能为String的数组  下同
      arrOfNumber:[Number],
      arrOfDate:[Date],
      arrOfBuffer:[Buffer],
      arrOfBoolean:[Boolean],
      arrOfMixed:[Schema.Types.Mixed],
      arrOfObjectId:[Schema.Types.ObjectId],
      nested:{
        stuff:String,  // 一个拥有具体属性的对象
      },
      populate:{
        type: String,
        ref: "users" 用于支持populate查询(联表查询)
        }
    });

Schema.Types.Mixed用户定义可复用的数据格式,如果未定义则默认为{}。

Schema.Types.Mixed = {
    name: String
}

var AnySchema = new Schema({any:Schema.Types.Mixed});
// 等于
var AnySchema = new Schema({any:{name: String}});

ObjectId是每个Schema默认配置的主键属性,属性名为_id,可自己定义一个_id来覆盖此属性。

Schema的扩展

Schema的扩支持为其增加公共的实例方法和静态方法,以便于Model和Entity的增删改查等操作。

实例方法在生成对应的实例(Entity层)之后才能调用,而静态方法在model层就可以使用了。

实例方法

  var PersonSchema = new Schema({name:String,type:String});
    //查询类似数据
    PersonSchema.methods.findSimilarTypes = function(cb){
      return this.model("Person").find({type:this.type},cb);
    }

使用

 var PersonModel = mongoose.model("Person",PersonSchema);
    var krouky = new PersonModel({name:"krouky",type:"前端工程师"});
    krouky.findSimilarTypes(function(err,persons){
      //persons中就能查询到其他前端工程师
    });

静态方法:

 PersonSchema.statics.findByName = function(name,cb){
    this.find({name:new RegExp(name,"i"),cb});
  }
  var PersonModel = mongoose.model("Person",PersonSchema);
  PersonModel.findByName("krouky",function(err,persons){
    //找到所有名字叫krouky的人
  });

Schema配置项
在new Schema();时,可以追加一个配置项来配置Schema.

 var config = {
    name: String,
    sex: String
    }
   
 var options = {
    safe: true, // 安全属性  默认为true
    strict: true,//严格配置(默认启用),存入数据库时,自动验证
    capped:1024,// 上线设置,限制一次操作的量
    versionKey: "__v" // 版本锁是Mongoose默认配置
    autoIndex: "", //自动索引
    }
 var ExampleSchema = new Schema(config,options);
Model

Model模型,是经过Schema构造来的,除了Schema定义的数据库骨架以外,还具有数据库行为模型,他相当于管理数据库属性、行为

  //先创建Schema
    var TankSchema = new Schema({
      name:"String",
      size:"String" 
    });
    //通过Schema创建Model
    var TankModel = mongoose.model("Tank",TankSchema);

有了对应的模型就可以直接拿来操作数据库

  var tank = {"something",size:"small"};
    TankModel.create(tank);
Entity

Entity是model的实例,根据model创建出来的Entity并没有存入数据库,需要调用Entity的save方法来储存。
Entity不具备Model的方法,所以只能用自己的方法。
需要注意的是,在新版本的mongoose文档中,Entity为Documents。

//通过Model创建Entity
 var tankEntity = new TankModel("someother","size:big");
 tankEntity.save();

限于篇幅,本小节暂时写到这里。下一节再详细讲解query,Validation,Middleware等更加高级的操作。

参考文章:
http://mongoosejs.com/docs/ap...
http://www.runoob.com/mongodb...
http://ourjs.com/detail/53ad2...
https://cnodejs.org/topic/548...
https://www.cnblogs.com/jaxu/...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/90665.html

相关文章

  • vue2.0开发聊天程序(八) 初步完成

    摘要:主要表现在复杂的语句事务支持等。仅支持,在等浏览器中,会出现样式布局混乱的情况。将群群对应的聊天记录保存在数据库。用户进入群聊,则将其加入到对应的中。文件大小不能超过通过模块操作登录注册将用户名作为唯一值。登录支持自动登录,将密码保存在中。 showImg(https://segmentfault.com/img/bV4jYr?w=402&h=710);showImg(https://...

    wmui 评论0 收藏0
  • vue2.0开发聊天程序(七) mongoose操作

    摘要:连接开启你的服务首先确保你已安装了,并且配置了的环境变量。此时再进入文件夹,里面会有许多文件。创建连接新建一个任意目录最好新建一个文件夹便于管理。连接错误安装依赖包,运行此文件说明已成功连接到数据库。 连接 开启你的mongodb服务 首先确保你已安装了mongodb,并且配置了mongodb的环境变量。在任意目录(建议在非中文目录)下新建database文件夹,在此文件夹下新建tes...

    jhhfft 评论0 收藏0
  • vue2.0开发聊天程序() 服务端的webScoket

    大吉大利,今晚吃鸡!                   - PUBG 时隔多日,终于再次拾起这个拖了很久的项目。并不是因为没时间,也不是因为这个项目对于我来说有多困难,就是一个字————懒。此项目的后台,当然是选择node.js来实现。作为一个前端,node.js比起java、php简单多了。 node支持的webSocket 在npm中有很多支持webSocket的模块,包括socket.io...

    hiyayiji 评论0 收藏0
  • vue2.0开发聊天程序(三)组件的通信

    摘要:我在中写了这段代码在组件被创建时候将会执行此函数相当于进入页面的自执行使用方法监听属性并执行一个回调函数按道理在元素被创建的时候,会将监听到的值赋给并且打印。 天地不仁以万物为刍狗,宇宙无义视众生如蝼蚁                  ——萧鼎和我 上一节列出了5个关键点,第一个路由已经解决了,接下来解决第二个问题: 组件的通信问题 一、组件的关系 组件之间的关系无非就是两种父子关系...

    ddongjian0000 评论0 收藏0

发表评论

0条评论

Dr_Noooo

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<