Node.js的mongodb驱动Mongoose(一)

起步

开始使用Mongoose前,请先安装好MongoDBNode.js

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代替。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值