「全栈初探」- Mongoose的简单使用

一、准备工作

1. 启动mongo数据库

关于下载安装启动数据库我这里就不做过多解释,谷歌下会有很多教程,启动成功后的命令窗如下所示:

image

2. 启用可视化Mongo工具

这里我们用的是Robo 3T,为什么要用可视化工具呢,因为小白对于命令行还是很陌生的,在命令行中查看数据库的内容有些不直观,这个可视化工具的安装包谷歌一下就阔以找到啦~

  1. 启动可视化工具
  2. 连接数据库(前提是已经启动了mongo数据库)
image
  1. 新建数据库mongoosetest
image

image
  1. 创建成功
image

数据库准备工作完成后,我们进入代码环节啦~

二、利用mongoose进行简单的数据库操作

1. 新建项目

  1. 新建空文件夹,命名为mongooseTest
  2. 启动终端,进入该文件夹
  3. 在命令行中输入npm init 初始化项目
npm init

这里有个小问题就是项目不能以驼峰命名,所以npm init后会让你输入一个别名,我们就叫mongoosetest好了,然后一直Enter,项目创建成功。


image
  1. 下载依赖包 mongoose
npm i mongoose -s
  1. 完成项目创建,项目结构:
image

2. 连接数据库

在根目录下创建db.js,输入以下代码,监听connection的几个事件,如果以上操作都没错的话,那么就会监听第一个事件“connect”事件,表示连接数据库成功,在最后,我们导出mongoose对象,以供其他模块使用。

/**
 * Created by vince on 2017/7/10.
 * db.js
 */
var mongoose = require('mongoose');
//设置mongo存储路径
var DB_URL = 'mongodb://localhost:27017/mongoosetest';

//连接数据库
mongoose.connect(DB_URL);

//连接成功后输出语句
mongoose.connection.on('connected',function () {
    console.log('Mongoose connect ' + DB_URL + " success");
});

//连接异常现实错误原因
mongoose.connection.on('error',function (err) {
    console.log('Mongoose connect Error:' + err);
});

//连接断开后输出语句
mongoose.connection.on('disconnected',function () {
    console.log('Mongoose connect disconnected');
});

//导出mongoose对象
module.exports = mongoose;

运行db.js,如下图所示:

image

第一步连接数据库成功啦~

3. 新建Schema与发布Model

那么什么是Schema呢?schema是mongoose里会用到的一种数据模式,可以理解为我们传统数据库中的表(table)结构的定义,简单地说,就是一个数据模板,每个schema会映射到mongodb中的一个collection,它不具备操作数据库的能力。

那什么又是Model呢?Model是由Schema发布生成的模型,具有抽象属性和行为的数据库操作对,Model可以直接操作Mongo数据库中的数据。

解释完了代码用说话,新建user.js,输入以下代码,创建一个user的schema,并且利用Schema发布一个Model,导出Model:

/**
 * Created by vince on 2017/7/10.  
 * user.js
 */
//引入之前我们创建的mongose对象
var mongoose = require('./db.js');
//创建一个schema对象
var Schema = mongoose.Schema;

//创建一个schema实例
var UserSchema = new Schema({
    username: {type: String},
    userpwd: {type: String},
    userage: {type: Number},
    logindate: {type: Date}
});

//利用UserSchema实例,发布一个User的model并且导出
module.exports = mongoose.model("User",UserSchema);

4. Model创造Entity实体,对数据库操作

那Entity又是什么呢?Entity是由Model创建的实体,他的操作也会影响数据库。

  • 新建insert.js,输入以下代码:
/**
 * Created by vince on 2017/7/10.
 * insert.js
 */
//引如User的Model
var User = require('./user');

//创建一个插入数据到数据库中的函数

function insert() {

    //用Model创建一个Entity实体,就是一个User的数据
    var user_1 = new User({
        username: 'Vince Hua',
        userpwd: '123456',
        userage: 20,
        logindate: new Date()
    });

    //调用user_1的save方法,插入user_1的数据到数据库中
    user_1.save(function (err, res) {
        if(err){
            console.log("Error: " + err);
        }else{
            console.log("Success Res: " + res)
        }
    });
}
//执行插入操作
insert();

以上代码中的user_1就是Model创建的Entity实体,它具有很多操作,svae()只是其中一个。

  • 运行insert.js,命令行输入框得到一下结果:


    image
  • 我们再查看数据库中:


    image
  • Amazing,我们成功插入一个数据啦~

5. 总结Schema、Model、Entity的关系

  • Schema : 一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力

  • Model : 由Schema发布生成的模型,具有抽象属性和行为的数据库操作对

  • Entity : 由Model创建的实体,他的操作也会影响数据库

  • Schema、Model、Entity的关系是:Schema生成Model,Model创造Entity,Model和Entity都可对数据库操作造成影响,但Model比Entity更具操作性。

三、mongoose的其他一些 “骚操作”

  • 更新数据库

这里我们是直接用Model来操作数据库,新建update.js

/**
 * Created by vince on 2017/7/10.
 * update.js
 */
//引入User的Model
var User = require("./user.js");

function update(){
    //wherestr是我们要进行操作的数据
    var wherestr = {'username' : 'Vince Hua'};
    //update是我们更新的数据
    var updatestr = {'userpwd': 'hhhhhh'};

    User.update(wherestr, updatestr, function(err, res){
        if (err) {
            console.log("Error:" + err);
        }
        else {
            console.log("Update Res: " + res);
        }
    })
}

update();
  • 运行updata.js,操作成功,命令行输出:
image
  • 更新成功,查看数据库:
image
  • 删除数据

同样我们直接用Model操作数据库,新建remove.js,输入以下代码:

/**
 * Created by vince on 2017/7/10.
 * remove.js
 */
var User = require("./user");

function del() {
    //需要删除的数据
    var wherestr = {'username' : 'Vince Hua'};

    User.remove(wherestr,function (err, res) {
        if(err){
            console.log("Error: " + err)
        }else{
            console.log("Success Remove: " + res);
        }
    })
}

del();
  • 执行代码,得到一下结果:
image
  • 查看数据库,显示数据已经被删除
image
  • 查找数据

  • 查找数据之前,我们插入一下几个数据


    image

依旧是使用Model操作数据库,新建find.js,输入以下代码:

/**
 * Created by vince on 2017/7/10.
 * find.js
 */
var User = require('./user');
function findByConditions() {
    var wherestr = {'username' : 'Mike Guo'};
    User.find(wherestr,function (err, res) {
        if(err){
            console.log("Error: " + err);
        }else{
            console.log("Find Res: " + res);
        }
    });
}
findByConditions();
  • 执行代码,得到查询结果:
image

四、总结

这里介绍的知识简单的mongoose的增删改查操作,只是方便我们第一次接触Mongo入门的小练习的Demo而已,mongoose还有其他强大的操作这里没有一一介绍,希望小伙伴们可以查看中文文档了解更多,如果你看了这篇文章觉得自己已经入门啦,那么恭喜你~

  • 所有代码已经上传到GitHub,传送门: Demo代码
  • nice to meet you ~ ,给个小star鼓励下😄
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容