[译]Mongoose

Mongoose原是指生活在非州卡拉哈里沙漠的哺乳动物,在这里Mongoose是指一种数据对象工具。

作者 Haojen Ma 日期 2016-06-01
[译]Mongoose

自翻译mongoose官方 Getting Started 文档,转载请著名出处。

快速开始

带你用最快的速度简单的了解mongoose的用法。

使用之前请确定已安装mongoDB和nodejs。

然后,安装mongoose:

npm install mongoose

引入

var mongoose = require('mongoose')
mongoose.connect('mongodb://localhost/test') //用mongoose连接数据库

错误捕获和连接成功:

var db = mongoose.connection;
//捕获错误
db.on('error',console.error.bind(console,'connection wrong'));
//连接第一次建立时触发的回调函数
db.once('open',function(){
	console.log('success')
})

Schema

在mongoose里,一切都派生自Schema。下面是一个schema创建的实例

var kittySchema = mongoose.Schema({
	name: String //data type is String
})

目前为止,我们在这个schema里创建了一个String类型的name属性。下面我们将把这个schema装载进一个Model

var Kitten = mongoose.model('Kitten',kittySchema)

Model

一个model就是一个构造类,每个类的实例都具有里面其在Schema里定义的属性和行为

//小猫实例
var silence = new Kitten({name:'Silence'})
console.log(silence.name) //'Silence'

在 kittySchema 添加一个方法,作用到所有类中

kittySchema.methods.speak = function(){
	var greeting = this.name
	? "meow nams is" + this.name
	:"I don't have a name";
	console.log(geeting)
}

var Kitten = mongoose.model('Kitten',kittySchema)

在这里,我们将这个方法添加到schema的methods属性中,然后使用该schema的Model都会继承这个方法

var fluffy = new Kitten({name:'fluffy'})
fluffy.speak() // meow name is fluffy

保存数据

但目前我们仍没有保存任何数据到MongoDB数据库,现在我们可以在实例上调用save方法,保存数据。

回调函数中的第一个参数,用来接收错误。
fluffy.save(function(err,fluffy){
	if(err) return console.log(err)
	fluffy.speak()
})

我们也可以获取存储的model实例

Kitten.find(function(err,kittens){
	if(err) return console.log(err)
	console.log(kittens)
})

如果我们想按照设定的条件查找,比如说根据猫咪的name属性查找

Kitten.find({name:flyffy},callback);

这个方法会返回一个kittens类里匹配该名字的数据。

Schema

写一个你自己的Schema

在mongoose里面,几乎是一切基于一个 schema 开始的。

//一个博客评论schema
var mongoose = require('mongoose')
var Schema = mongoose.Schema

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

创建一个model

//使用我们刚才创建的schema
var Blog = mongoose.model('Blog',blogSchema)

实例方法

文档(documents),内置有很多它自己的实例方法,我们也可以定义自己的方法。

var animalSchema = new Schema({ name: String, type: String})

//编写自己的方法,基于schema上
animalSchema.methods.findSimilarTypes = function(cb){
	return this.model('Animal').find({type:this.type},cb)
}

现在所有的 animalSchema 实例都有这个方法了

Statics

添加一个静态方法到model里。

//继续使用上面的animalSchema
animalSchema.statics.findByName = function (name,cb){
	return this.find({name: new RegExp(name,'i')}, cb)
}

var Animal = mongoose.model('Animal',animalSchema);
Animal.findByName('fido',function(err,animals){
	console.log(animals);
})