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

2024-06-07 15:32
文章标签 nosql 探究 数据库 学习

本文主要是介绍【探究】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){//查询到的所有personconsole.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简单操作实例

这篇关于【探究】NoSQL数据库学习(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1039573

相关文章

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

《offer来了》第二章学习笔记

1.集合 Java四种集合:List、Queue、Set和Map 1.1.List:可重复 有序的Collection ArrayList: 基于数组实现,增删慢,查询快,线程不安全 Vector: 基于数组实现,增删慢,查询快,线程安全 LinkedList: 基于双向链实现,增删快,查询慢,线程不安全 1.2.Queue:队列 ArrayBlockingQueue:

关于如何更好管理好数据库的一点思考

本文尝试从数据库设计理论、ER图简介、性能优化、避免过度设计及权限管理方面进行思考阐述。 一、数据库范式 以下通过详细的示例说明数据库范式的概念,将逐步规范化一个例子,逐级说明每个范式的要求和变换过程。 示例:学生课程登记系统 初始表格如下: 学生ID学生姓名课程ID课程名称教师教师办公室1张三101数学王老师101室2李四102英语李老师102室3王五101数学王老师101室4赵六103物理陈

数据库期末复习知识点

A卷 1. 选择题(30') 2. 判断范式(10') 判断到第三范式 3. 程序填空(20') 4. 分析填空(15') 5. 写SQL(25') 5'一题 恶性 B卷 1. 单选(30') 2. 填空 (20') 3. 程序填空(20') 4. 写SQL(30') 知识点 第一章 数据库管理系统(DBMS)  主要功能 数据定义功能 (DDL, 数据定义语

给数据库的表添加字段

周五有一个需求是这样的: 原来数据库有一个表B,现在需要添加一个字段C,我把代码中增删改查部分进行了修改, 比如insert中也添入了字段C。 但没有考虑到一个问题,数据库的兼容性。因为之前的版本已经投入使用了,再升级的话,需要进行兼容处理,当时脑子都蒙了,转不过来,后来同事解决了这个问题。 现在想想,思路就是,把数据库的表结构存入文件中,如xxx.sql 实时更新该文件: CREAT