概述
像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里面的三个概念很重要:服务器
- schema,对应于mongodb里面的collection(集合),在这里定义键和类型(schematypes)。
- model,对应于schemas的一个类,经过它来建立条目。
- 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) })