Node.js的mongodb驱动Mongoose(一)

2017-10-26 20:05:57来源:CSDN作者:WuLex人点击

分享

起步

开始使用Mongoose前,请先安装好MongoDB和Node.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 schemavar animalSchema = new Schema({ name: String, type: String });// assign a function to the "methods" object of our animalSchemaanimalSchema.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 animalSchemaanimalSchema.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!})// orTank.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代替。

微信扫一扫

第七城市微信公众平台