起步
npm安装mongoose
$ npm install mongoose
连接MongoDBa数据库
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
监听数据库连接状态
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function (callback) {
// yay!
});
定义模式
var kittySchema = mongoose.Schema({
name: String
})
将模式编译为模型
var Kitten = mongoose.model('Kitten', kittySchema)
由模型 New 一个实例
var silence = new Kitten({ name: 'Silence' })
console.log(silence.name) // 'Silence'
为模式创建方法
methodss方法必须在schema编译为model之前添加
kittySchema.methods.speak = function () {
var greeting = this.name
? "Meow name is " + this.name
: "I don't have a name"
console.log(greeting);
}
var Kitten = mongoose.model('Kitten', kittySchema)
文档实例使用methods方法
var fluffy = new Kitten({ name: 'fluffy' });
fluffy.speak() // "Meow name is fluffy"
保存文档实例
fluffy.save(function (err, fluffy) {
if (err) return console.error(err);
fluffy.speak();
});
查询文档实例
.find()可以查询并返回对应集合里面的所有文档
Kitten.find(function (err, kittens) {
if (err) return console.error(err);
console.log(kittens)
})
通过条件查询文档实例
Kitten.find({ name: /^Fluff/ }, callback)
Schemas模式
定义Schema
Mongoose里的一切都始于Schema。每一个schemas映射到对应的MongoDB数据库的集合collection,并定义对应集合的文档形式
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
}
});
在blogSchemad定义的每个键key将被转换为相关SchemaType定义一个属性。例如,标题(title)将被转换为字符串(String)的 SchemaType 并将日期(date)转换为日期的 SchemaType 。键(keys)也可以被指定嵌套的对象,包含进一步的键/类型定义(例如,上面的 meta属性)
允许使用的SchemaTypes:
- String
- Number
- Date
- Buffer
- Boolean
- Mixed
- ObjectId
- Array
Schema不仅定义了文档和属性的结构,还定义了文档的实例方法、静态模型方法、复合索引等
实例方法methods
模型的实例是文档(document)。文档本身有自己的内置方法。我们也可以自定义文档的实例方法
// define a schema
var animalSchema = new Schema({ name: String, type: String });
// assign a function to the "methods" object of our animalSchema
animalSchema.methods.findSimilarTypes = function(cb) {
return this.model('Animal').find({ type: this.type }, cb);
};
现在用文档调用我们定义的实例方法
var Animal = mongoose.model('Animal', animalSchema);
var dog = new Animal({ type: 'dog' });
dog.findSimilarTypes(function(err, dogs) {
console.log(dogs); // woof
});
静态方法statics
给模式添加静态方法
// assign a function to the "statics" object of our 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);
});
实例方法methods提供给文档使用,静态方法statics提供给模型使用
Models模型
models是由Schema(模式)定义的构造器。通过models可以实现数据库的文档操作。
编译第一个models
var schema = new mongoose.Schema({ name: 'string', size: 'string' });
var Tank = mongoose.model('Tank', schema);
models的第一个参数“tank”是你的模型集合的单数名称。Mongoose会自动寻找你的模型名称的复数形式。
因此,在数据库中,模型“Tank“”对应数据库中”tanks”的集合。
.model()函数实际上为Schema创建的一个副本,所以在调用.model()之前,要先定义好Schema的结构。
#
建document文档
document是models的实例,document可以很方便的保存到数据库中
var Tank = mongoose.model('Tank', yourSchema);
var small = new Tank({ size: 'small' });
small.save(function (err) {
if (err) return handleError(err);
// saved!
})
// or
Tank.create({ size: 'small' }, function (err, small) {
if (err) return handleError(err);
// saved!
})
在构建document时,请先确保mongodb数据库在连接状态
#
查询
Mongoose支持丰富的文档查询方法。可以使用find,findById,findOne,或者where等静态方法来查找文档
Tank.find({ size: 'small' }).where('createdDate').gt(oneYearAgo).exec(callback);
#
删除
Mongoose提供删除文档的静态方法, 用于删除符合条件的文档
Tank.remove({ size: 'large' }, function (err) {
if (err) return handleError(err);
// removed!
});
#
更新
每个模型都有自己的更新方法,用于修改数据库中的文档,不将它们返回到您的应用程序。
详细看API文档。
如果你想要更新一个文档数据库,并将结果返回给你的应用程序,使用findOneAndUpdate代替。