mongoose入门

概述

像Mysql和Mongodb这样的数据库,通常都是在命令行或者工具里面进行操做,若是想在node搭建的服务器上面操做,就必需要利用特殊的模块的。其中操做Mongodb数据库须要用到mongoose模块,下面记录我学习mongoose模块的过程,供之后开发时参考,相信对其余人也有用。html

参考资料:mongoose文档node

准备工做

须要先安装MongDB数据库和Node.js。sql

而后在npm里面输入以下命令:mongodb

//初始化
npm init

//安装mongoose依赖
npm install mongoose

链接数据库

若是要操做数据库,确定须要先链接数据库(并不须要额外在mongdb数据库里面新建,若是node发现不存在这个数据库会自动建立一个,可是须要先启动mongodb服务):数据库

// getting-started.js
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');

而后用node运行getting-started.js便可链接到mongodb数据库。可是上面的代码并无作任何事,因此咱们须要加入以下代码进行操做:npm

var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function (callback) {
  console.log('成功链接数据库');
});

用node运行getting-started.js以后会在命令行打印“成功链接数据库”,这就表示,以后全部的操做都必须在那个回调函数里面写。api

建立数据库和条目

mongoose里面的三个概念很重要:服务器

  1. schema,对应于mongodb里面的collection(集合),在这里定义键和类型(schematypes)。
  2. model,对应于schemas的一个类,经过它来建立条目。
  3. document,对应于mongodb里面的entry,就是条目。

通常经过下面这个过程建立数据库的条目:异步

//建立Schema
var personSchema = mongoose.Schema({
    name: String,
    height: Number
});

//经过Schema建立model,因为是类,因此首字母大写
var PersonModel = mongoose.model('Person', personSchema);

//建立document
var tim = new PersonModel({ name: 'Tim', height: 150});

//保存(这是一个异步动做,回调会在同步代码完毕后再运行)
tim.save(function(err, tim) {
    console.log(tim.name + '保存成功');
})

//输出tim
console.log(tim);

注意:若是数据库中有Person这个collection,则会自动链接到这个collection,不然会自动建立一个。mongoose

schema

对于schema,咱们能够对它作三件事:增长或删除键;定义主键;增长方法

咱们能够用add方法增长(删除)键:

personSchema.add({ weight: 'number', nickname: 'string' });

能够经过下面的示例感觉一下:

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) {
  console.log('开始进行MongoDB数据库操做');

  var personSchema = mongoose.Schema({
      name: String,
      height: Number
  });

  var PersonModel = mongoose.model('Person', personSchema);

  var tim = new PersonModel({ name: 'Tim', height: 150});

  personSchema.add({ weight: 'number', nickname: 'string' });

  var bim = new PersonModel({ name: 'bim', height: 160, weight: 60});

  //输出tim的名字
  console.log(tim); //{_id: 5aed9a70595695188446035d, name: 'Tim', height: 150}
  console.log(bim); //{_id: 5aed9a70595695188446035e, name: 'Bim', height: 160, weight: 60}
  console.log(bim.nickname); //undefined
});

从上面的例子能够看到,没有定义的属性是undefined,而且不会输出。咱们还能够看到,有一个默认的属性_id,它是schema的默认主键,若是想修改主键的话,能够用下面的方法:

var personSchema = mongoose.Schema({
    id: mongoose.Schema.ObjectId,
    name: String,
    height: Number
});

var PersonModel = mongoose.model('Person', personSchema);

var tim = new PersonModel({ id: new mongoose.Types.ObjectId, name: 'Tim', height: 150});

可是上面只是定义了一个类型为ObjectId的主键而已,它会自动增长,可是它并非主键。mongodb不容许自定义主键(貌似是这样?),可是能够用虚拟键解决这个问题。

能够经过下面的代码给schema增长方法:

personSchema.methods.speak = function() {
    var greeting = this.name ? 'My name is ' + this.name : 'I have not a name';
    console.log(greeting);
}
var PersonModel = mongoose.model('Person', personSchema);
var tim = new PersonModel({ name: 'Tim', height: 150});
tim.speak();

model

model是建立条目的类,对于model咱们想作这几件事:增删改查

增操做:利用model的create方法。(这个方法会自动保存条目)

PersonModel.create({name: sim}, function(err, person) {
        console.log('增长' + person.name);
});

删除操做:利用model的remove方法。

PersonModel.remove({name: Tim}, function(err) {
        console.log('删除成功');
});

改操做:有不少种方法,可是全部方法都须要加一个回调函数,否则不会成功

var condition = {name: 'bim'},
    query = {$set:{name: 'time', nickname: 'haha'}};

//使用update方法
PersonModel.update(condition, query, function() {
    console.log('修改为功');
});

//使用findOneAndUpdate方法
PersonModel.findOneAndUpdate(condition, query, function() {
    console.log('修改为功');
});

查操做:利用model的find方法。

PersonModel.find({ name: 'bim' }, function(err, person){
    console.log(person[0]);
})

注意:增操做和改操做都是异步的,因此在增操做和改操做以后当即查询是查不到的

document

document就是条目entry,对于document咱们想对它作一些处理,好比进行回调等。

这个时候就能够利用exec方法了,实例以下:

var query = PersonModel.findOne({ 'name': 'time' });
query.select('name nickname');
query.exec(function (err, person) {
  if (err) return handleError(err);
  //输出:time is also called haha.
  console.log('%s is also called %s.', person.name, person.nickname) 
})
相关文章
相关标签/搜索