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) 
})
相關文章
相關標籤/搜索