【探究】NoSQL数据库学习(二)

写在前面

之前一篇简单介绍了NoSQL数据库mongoDB的基本语法,暂且不深入研究它高级的用法,这一节具体谈谈nodeJS里如何快速操作mongoDB数据库,也好快速上手。

mongoose介绍

基本概念

Schema —— 一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力
Model —— 由Schema发布生成的模型,具有抽象属性和行为的数据库操作对
Entity —— 由Model创建的实体,他的操作也会影响数据库

记住这三者的关系:Schema生成Model,Model创造Entity,Model和Entity都可对数据库操作造成影响,但Model比Entity更具操作性。

连接数据库

mongoDB安装好之后默认会生成一个test数据库,我们就以这个为例子。

var mongoose = require('mongoose');    //引用mongoose模块
var db = mongoose.createConnection('localhost','test'); //创建一个数据库连接

打开本机localhost的test数据库时,我们可以监测是否有异常

 db.on('error',console.error.bind(console,'连接错误:'));
 db.once('open',function(){
    //一次打开记录
    console.log('数据库连接成功!');
 });

简单操作

成功开启数据库后,就可以执行数据库相应操作,假设以下代码都在回调中处理。

定义一个schema

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

将该Schema发布为Model

var PersonModel = db.model('Person',PersonSchema);
//如果该Model已经发布,则可以直接通过名字索引到,如下:
//var PersonModel = db.model('Person');
//如果没有发布,上一段代码将会异常

用Model创建Entity

var personEntity = new PersonModel({name:'Krouky'});
//打印这个实体的名字看看
console.log(personEntity.name); //Krouky

我们甚至可以为此Schema创建方法

//为Schema模型追加speak方法
    PersonSchema.methos.speak = function(){
      console.log('我的名字叫'+this.name);
    }
    var PersonModel = db.model('Person',PersonSchema);
    var personEntity = new PersonModel({name:'Krouky'});
    personEntity.speak();//我的名字叫Krouky

Entity是具有具体的数据库操作CRUD的

personEntity.save();  //执行完成后,数据库就有该数据了

如果要执行查询,需要依赖Model,当然Entity也是可以做到的

PersonModel.find(function(err,persons){
    //查询到的所有person
    console.log(persons);
});

注意:
1. 具体的如何配置Schema、Model以及Model和Entity的相关操作,我们会在后面进行
2. Model和Entity都有能影响数据库的操作,但仍有区别,后面我们也会做解释

一个lib式的实例

下面是个很好的例子,基本囊括了mongoose操作mongoDB的常用操作,初学者大可以奉为library。

mongoose官方API http://mongoosejs.com/docs/api.html

// mongoose 链接
var mongoose = require('mongoose');
var db       = mongoose.createConnection('mongodb://127.0.0.1:27017/NodeJS'); 
// 链接错误
db.on('error', function(error) {
    console.log(error);
});
// Schema 结构
var mongooseSchema = new mongoose.Schema({
    username : {type : String, default : '匿名用户'},
    title    : {type : String},
    content  : {type : String},
    time     : {type : Date, default: Date.now},
    age      : {type : Number}
});
// 添加 mongoose 实例方法
mongooseSchema.methods.findbyusername = function(username, callback) {
    return this.model('mongoose').find({username: username}, callback);
}
// 添加 mongoose 静态方法,静态方法在Model层就能使用
mongooseSchema.statics.findbytitle = function(title, callback) {
    return this.model('mongoose').find({title: title}, callback);
}
// model
var mongooseModel = db.model('mongoose', mongooseSchema);
// 增加记录 基于 entity 操作
var doc = {username : 'emtity_demo_username', title : 'emtity_demo_title', content : 'emtity_demo_content'};
var mongooseEntity = new mongooseModel(doc);
mongooseEntity.save(function(error) {
    if(error) {
        console.log(error);
    } else {
        console.log('saved OK!');
    }
    // 关闭数据库链接
    db.close();
});
// 增加记录 基于model操作
var doc = {username : 'model_demo_username', title : 'model_demo_title', content : 'model_demo_content'};
mongooseModel.create(doc, function(error){
    if(error) {
        console.log(error);
    } else {
        console.log('save ok');
    }
    // 关闭数据库链接
    db.close();
});
// 修改记录
mongooseModel.update(conditions, update, options, callback);
var conditions = {username : 'model_demo_username'};
var update     = {$set : {age : 27, title : 'model_demo_title_update'}};
var options    = {upsert : true};
mongooseModel.update(conditions, update, options, function(error){
    if(error) {
        console.log(error);
    } else {
        console.log('update ok!');
    }
    //关闭数据库链接
    db.close();
});
// 查询
// 基于实例方法的查询
var mongooseEntity = new mongooseModel({});
mongooseEntity.findbyusername('model_demo_username', function(error, result){
    if(error) {
        console.log(error);
    } else {
        console.log(result);
    }
    //关闭数据库链接
    db.close();
});
// 基于静态方法的查询
mongooseModel.findbytitle('emtity_demo_title', function(error, result){
    if(error) {
        console.log(error);
    } else {
        console.log(result);
    }
    //关闭数据库链接
    db.close();
});
// mongoose find
var criteria = {title : 'emtity_demo_title'}; // 查询条件
var fields   = {title : 1, content : 1, time : 1}; // 待返回的字段
var options  = {};
mongooseModel.find(criteria, fields, options, function(error, result){
    if(error) {
        console.log(error);
    } else {
        console.log(result);
    }
    //关闭数据库链接
    db.close();
});
// 删除记录
var conditions = {username: 'emtity_demo_username'};
mongooseModel.remove(conditions, function(error){
    if(error) {
        console.log(error);
    } else {
        console.log('delete ok!');
    }

    //关闭数据库链接
    db.close();
});

总结

独自摸索一门新的技术,我习惯的思路是螺旋式上升。首先了解改技术的发展历史,追溯它的过去也好展望它的未来,然后和同类型技术进行比较,结合实际的需求,优胜略汰,接着就是 寻找最合适的工具去做开发了。这个过程可以 看一些视频教程(湿货帮你快速入门)、看一些该技术相关的书籍(干货给你系统的思维,提升理解)、逛一些技术相关的博客论坛(半干半湿的东西会给你最前沿的信息)。

在没有一定的开发经验积累之前,着急地提高深度,折腾什么高大上的用法 是不合时宜的(除非你是站在牛人的肩膀上,人家肯一路指导)。自学是个自我领悟的过程,以实践为基础,提升自我为目的。


参考资料:

@参考: Mongoose学习参考文档——基础篇
@参考: node.js下mongoose简单操作实例

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值