http://www.html-js.com/article/Mongoose-based-mongoose-entry-a
Mongoose是一个提供了MongoDB地相映射的Node.js库,它在Node.js中与ORM(Object Relational Mapping)有着类似的接口。如果你不熟悉ORM或者Mongoose中的Object Data Mapping(ODM),意思是Mongoose将数据库中的数据转换为JavaScript对象以供你在应用中使用。我们现在就来看看怎样是使用Mongoose来创建并存储数据。
注意:使用Mongoose的前提是你已经安装了Node.js和MongoDB。运行下面的例子首先需要启动MongoDB。
连接到MongoDB
在本文中,我们将连接到MongoDB的test数据库。我们也要确保任何发生的错误都被打印到控制台中。注意open事件的使用 – 当你创建一个模式以及编译模型时该事件发生。
var mongoose = require("mongoose");
var db = mongoose.connection;
db.on('error',console.error);
db.once('open',function(){
//在这里创建你的模式和模型
});
mongoose.connect('mongodb://localhost/test');
模式和模型
在一开始,我们需要一个模式和一个模型来将数据永久的保存在MongoDB数据库中。模式定义了一个集合中文档的结构,模型被用来创建将要存储在文档中的数据实例。我们将会创建一个电影数据库来保持追踪看看哪一步电影拥有credit cookies。我们先来创建一个电影的模式和模型:
var movieSchema = new mongoose.Schema({
title: {type: String},
rating: String,
releaseYear: Number,
hasCreditCookie: Boolean
});
//使用movieSchema作为结构编译一个'Movie'模型
//Mongoose同时也会创建一个叫做'Movie'的MongoDB集合用来存放这些文档
注意到Movie模型是首字母大写的,这是因为当一个模型被编译时,结果是一个用来创建实例的构造函数。从模型构造函数创建的实例都是即将保存在Mongo中的文档。
创建,提取,更新和删除(CRUD)
创建一个新的电影文档非常的轻松,因为你已经定义了模型,只需要实例化一个Movie模型即可。更新和存储也同样简单,进行更改然后调用你的文档中的save函数。
var thor = new Movie({
title: 'Thor',
rating: 'PG-13',
releaseYear: '2011', //注意我们在这里使用一个字符串而不是一个数字 -- Mongoose会为我们自动转换
hasCreditCookie: true
});
thor.save(function(err,thor){
if(err) return console.log(err);
console.dir(thor);
});
save函数将会提供最新创建的文档,你可以在控制台中看到结果:
{
"title": "Thor",
"rating": "PG-13",
"releaseYear": 2011,
"hasCreditCookie": true,
"_id": "519a979e918d4d0000000001",
"__v": 0
}
从已有的文档中提取数据需要用一种不同的方法。你可以依据模式的任何属性来查找文档并且找到任何数量的文档 – 使用findOne来将结果范围缩小到一个文档。
//通过名字查找一部电影
Movie.findOne({title: 'Thor'},function(err,thor){
if(err) return console.err(err);
console.dir(thor);
});
//查找所有电影
Movie.find(function(err,movies){
if(err) return console.err(err);
console.dir(movies);
});
//查找所有具有一个credit cookie的电影
Movie.find({hasCreditCookie: true}, function(err,movies){
if(err) return console.error(err);
console.dir(movies);
});
Mongoose也允许你轻松的创建静态辅助函数来查找数据:
movieSchema.statics.findAllWithCreditCookies = function(callback){
return this.find({ hasCreditCookie: true}, callback);
};
//只用这个副主函数作为编译的Movie模型的一个静态函数
Movie.findAllWithCreditCookies(function(err,movies){
if(err) return console.error(err);
console.dir(movies);
});
Mongoose使MongoDB中的CRUD操作变得异常的简单。同Express一起,你可以创造出令人惊讶的web应用。