Mongoose是MongoDB的一个对象模型工具,可以工作于异步环境下

install

安装:npm install -g mongoose

使用:var mongoose = require('mongoose');

连接到MongoDB数据库

首先,我们需要定义一个连接;

如果应用只使用一个数据库,直接使用 mongoose.connect()

如果需要创建附加数据库连接,需要使用 mongoose.createConnection()

mongoose 连接数据库的方式支持 URI 或参数(host, databse, port)的形式:

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/blog');

//- URI组成 = mongodb:// + 数据库主机地址 + 数据库名

连接一旦建立成功,该连接实例的 open 事件就被触发;

如果,数据库名不存在,会自动创建它;

如果,使用的是 mongoose.connect() 方式,连接对象为 mongoose.connection

如果,使用的是 mongoose.createConnection() 方式,返回的是 Connection 对象;

mongoose 在与数据库真正建立连接之前便缓存了所有的命令,也就是说在定义模型、执行查询时不必非得确认与 MongoDB 数据库的连接是否成功;

定义schema

Everything in Mongoose starts with a Schema

通过 Schema 我们可以快速定义映射到 MongoDB 的文档结构和存储数据的类型等;如:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var blogSchema = new Schema({
  title:  String,
  author: String,
  body:   String,
  comments: [{ body: String, date: Date }],
  date: { type: Date, default: Date.now },
  hidden: Boolean,
  meta: {
    votes: Number,
    favs:  Number
  }
});

当我们定义好 Schema 之后,如果想再追加一些文档,可以使用 Schemaadd() 方法:

blogSchema.add({ category: 'string', titlecolor: 'string' });

, 文档如同关系型数据库中的行;

Schema 支持的类型有:

  • String
  • Number
  • Date
  • Buffer
  • Boolean
  • Mixed
  • ObjectId
  • Array

Schema 不仅仅能用来定义文档结构和存储的数据类型,还可以用来定义如下内容:

  • validators 异步和同步
  • defaults 默认值
  • getters
  • setters
  • indexes 索引
  • middleware 中间件
  • methods definition 方法定义
  • static definition 静态定义
  • plugins 插件

下面的代码向我们展示了这些功能的一部分:

var Comment = new Schema({
  name: { type: String, dafult: 'Reg.Jay' },
  age: { type: Number, min: 18, index: true },
  bio: { type: String, match: /[a-z]/ },
  date: { type: Date, default: Date.now }
});

//- 定义setter
Comment.path('name').set(function(arg) {
  return arg.capitalize();
});

//- 定义中间件
Comment.pre('save', function(next) {
  notify(this.get('email'));
  next();
});

创建模型

模型是通过 Schema interface 定义的;一个模型就是 MongoDB 的一个集合;

要使用我们定义的 schema,需要转换 schema 到模型上通过 mongoose.model(modelName, schema) 方法(也就是创建模型):

var Blog = mongoose.model('Blog', blogSchema);

创建好模型之后,可以通过实例化模型来使用它,文档就是实例化的模型;通过文档我们就能很方便的操作数据库了;

var newblog = new Blog({
  title:  "Mongoose",
  author: "Reg.Jay",
  body:   "Documents are instances of out model. Creating them and saving to the database is easy",
  comments: [{ body: "It's very cool! Thanks a lot!", date: "2014.07.28" }],
  hidden: false,
  meta: {
    votes: 100,
    favs:  99
  }
});

实例化模型后,需要保存才能写入到数据库哟:

newblog.save(function(err) {});

最终完整的代码:

model.js源代码:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
mongoose.connect('mongodb://localhost/blog');

var blogSchema = new Schema({
  title: String,
  author: String,
  body: String,
  comments: [{ body: String, date: Date }],
  date: { type: Date, default: Date.now },
  hidden: Boolean,
  meta: {
    votes: Number,
    favs: Number
  }
});

module.exports = blogSchema;

blog.js源代码:

var mongoose = require('mongoose');
var blogSchema = require('./model');
var Blog = mongoose.model('Blog', blogSchema);

var newblog = new Blog({
  title: "Mongoose",
  author: "Reg.Jay",
  body: "Document are instances of out model. Creating them add saving to the database is easy",
  hidden: false,
  meta: {
    votes: 100,
    favs: 99
  }
});

newblog.save(function(err) {
  if (err) handleError(err);
  console.log('Success');
});

终端下查看数据:

$ mongo
MongoDB shell version: 2.4.9
connecting to: test
> show dbs;
blog    0.203125GB
jay        0.203125GB
local    0.078125GB
test    0.203125GB
> use blog;
switched to db blog
> show collections;
blogs
system.indexes
> db.blogs.find()
{ "title" : "Mongoose", "author" : "Reg.Jay", "body" : "Document are instances of out model. Creating them add saving to the database is easy", "hidden" : false, "_id" : ObjectId("53cba279f8e875aa0c4d4d19"), "meta" : { "votes" : 100, "favs" : 99 }, "date" : ISODate("2014-07-20T11:05:29.747Z"), "comments" : [ ], "__v" : 0 }
>