在使用nodejs时候,须要存储一些简单json数据的状况下,不少人会推荐使用mongodb。mongodb是一个文档型数据库,在 sql 中,数据层级是:数据库(db) -> 表(table) -> 记录(record)-> 字段;在 mongodb 中,数据的层级是:数据库 -> collection -> document -> 字段。其余更多详细的概念能够去官网等地方查询,个人主要目的是结合nodejs尽快用起来。html
mongodb的安装在mac上推荐使用brew:node
brew install mongodb
安装好之后在在命令行窗口输入mongod,就能够启动mongodb,而后新开一个shell窗口,输入mongo,就可使用shell命令来建立操做数据库,具体命令均可以在官网找到,熟悉一些基本的命令show、use、find等就能够了。下面咱们主要在nodejs中使用moogoose来操做数据库。sql
moogoose是一个odm,object-document mapping,对象文档映射。它的做用就是,在程序代码中,定义一下数据库中的数据格式,而后取数据时经过它们,能够把数据库中的 document 映射成程序中的一个对象,这个对象有 .save .update 等一系列方法,和 .title .author 等一系列属性。在调用这些方法时,odm 会根据你调用时所用的条件,自动转换成相应的 mongodb shell 语句帮你发送出去。天然地,在程序中链式调用一个个的方法要比手写数据库操做语句具备更大的灵活性和便利性。在nodejs中使用moogoose有一个简单的demo:mongodb
// 首先引入 mongoose 这个模块 var mongoose = require('mongoose'); // 而后链接对应的数据库:mongodb://localhost/test // 其中,前面那个 mongodb 是 protocol scheme 的名称;localhost 是 mongod 所在的地址; // 端口号省略则默认链接 27017;test 是数据库的名称 // mongodb 中不须要创建数据库,当你须要链接的数据库不存在时,会自动建立一个出来。 mongoose.connect('mongodb://localhost/test'); // 上面说了,我推荐在同一个 collection 中使用固定的数据形式。 // 在这里,咱们建立了一个名为 Cat 的 model,它在数据库中的名字根据传给 mongoose.model 的第一个参数决定,mongoose 会将名词变为复数,在这里,collection 的名字会是 `cats`。 // 这个 model 的定义是,有一个 String 类型的 name,String 数组类型的 friends,Number 类型的 age。 // mongodb 中大多数的数据类型均可以用 js 的原生类型来表示。至于说 String 的长度是多少,Number 的精度是多少。String 的最大限度是 16MB,Number 的整型是 64-bit,浮点数的话,js 中 `0.1 + 0.2` 的结果都是乱来的。。就不期望什么了。。 // 这里能够看到各类示例:http://mongoosejs.com/docs/schematypes.html var Cat = mongoose.model('Cat', { name: String, friends: [String], age: Number, }); // new 一个新对象,名叫 kitty // 接着为 kitty 的属性们赋值 var kitty = new Cat({ name: 'Zildjian', friends: ['tom', 'jerry']}); kitty.age = 3; // 调用 .save 方法后,mongoose 会去你的 mongodb 中的 test 数据库里,存入一条记录。 kitty.save(function (err) { if (err) // ... console.log('meow'); });
上面的demo就能够简单使用起来mongodb存储一条记录,可是对于mongodb三个最基本的概念Schema, Model, Entity并未涉及太多。在项目应用时候,须要严格的划分定义。shell
Schema数据库
一种以文件形式存储的数据库模型骨架,不具有数据库的操做能力,仅仅是定义数据属性的一个模型。在Schema中能够定义方法,一个简单的例子以下:json
var mongoose = require('mongoose'); var MovieSchema = new mongoose.Schema({ doctor: String, title: String, language: String, country: String, year: String, summary: String, poster: String, meta: { createAt: { type: Date, default: Date.now() }, updateAt: { type: Date, default: Date.now() } } }); MovieSchema.statics = { fetch: function (cb) { return this .find({}) .sort('meta.updateAt') .exec(cb); }, findById: function (id, cb) { return this .findOne({_id: id}) .exec(cb); } };
Model数组
由Schema发布生成的模型,具备抽象属性和行为的数据库操做对。能够认为是一个管理数据库属性、行为的类。具体例子以下:app
var Movie=mongoose.model('Movie', MovieSchema);
Entityless
由Model建立的实体,他的操做也会影响数据库。他的方法和Model上操做的方法有些区别,好比新增是save,而model上是create。项目中使用的一个片断以下:
_movie = new Movie({ doctor: movieObj.doctor, title: movieObj.title, language: movieObj.language, country: movieObj.country, year: movieObj.year, poster: movieObj.poster, flash: movieObj.flash, summary: movieObj.summary }); _movie.save(function(err, movie) { if (err) { console.log(err); } res.redirect('/movie/' + movie._id); });
其中_movie就是Entity,利用.save在数据库中新增了一条记录。
本文简单介绍了一下mongodb和mongoose的基本使用,就能够在项目中简单的使用起来,关于其中的更具体的用法和一些区别,须要进一步探索和使用。
主要参考了如下两篇文章,引用了其中一些定义和一个demo。
1.mongodb简介
2.mongoose简介