MongoDB 的 ODM:mongoose
-
mongoose 是一套給 Node.js 用的 MongoDB ODM,跟常聽到的 ORM 不同的地方只是一些技術名詞定義上的把戲,其實是差不多的意思。
透過 mongoose 可以用包裝過的、更高階的、更直覺的 API 語法,以及模擬 SQL 資料庫 schema-based 的方式,來操作 MongoDB 資料庫。
以下是個官方文件給的簡單範例,先建立了一個叫做 Dog 的 Model,
model
的第二個參數就是建立 schema 的所在var Dog = mongoose.model('Dog', { name: String } ); var puppy = new Dog({ name: 'Hachi'}); puppy.save(function (err) { if (err) //... console.log('wolf'); });
與 MongoDB 建立連線
本帖部分内容已隐藏,请登入并回覆,以查看隐藏内容!var express = require('express'), app = express() app.use(express.cookieParser()) app.get('/', function(req, res){ console.log(req.cookies) res.send('hello') }) app.listen('4000')
打開瀏覽器訪問 http://localhost:4000 應該可以看到「hello」的文字,從 console 應該也能看到有關 cookies 的資訊(有可能只是一個空的物件)。
再來就是把 mongoose 給 requrie 進來,然後讓它跟 MongoDB 嘗試建立連線,連線的 URL 協議一定要用
mongodb://
這個 prefix:var mongoose = require('mongoose') mongoose.connect('mongodb://localhost/test')
mongoose 的兩個概念:Schema 與 Model
MongoDB 是以 documents 為基礎,在 SQL 資料庫稱為 table 的東西,在 NoSQL 裡稱為 collection。當然,這又是一種名詞定義上的把戲,實質上大同小異。
Schema
mongoose 的 Schema 概念就是用 schema-based 的方式,定義一個 collection 的組成結構,用程式碼描述會這樣子寫:
var Schema = mongoose.Schema var UserSchema = new Schema( { name: { type: String }, login: { type: String, unique: true }, email: { type: String, unique: true }, create_at: { type: Date, default: Date.now }, update_at: { type: Date, default: Date.now } } )
因為 MongoDB 是 schema-less 相當有彈性,所以如果上面這個 schema 某些「欄位」沒有賦值,那麼在 MongoDB 裡就不會有那個「欄位」。說「欄位」是 SQL 的思維,可是我覺得這樣講會比較好理解。
Model
而 mongoose 的 Model 概念,則是對一個 collection 結構定義與操作方法的集合,也就是用 Schema 定義了一個 collection 的結構,加上其他對這個 collection 的驗證設定、操作方法等等,便構成了一個 Model。
結合剛剛的 schema 範例,可以再加上一些驗證跟操作的方法:
UserSchema.pre('save', function(next) { // do something... }) UserSchema.statics = { getUserByLogin: function(login, callback) { this.findOne({ login: login }) .exec(callback) } }
最後將這個 Schema 定義到一個叫做 User 的 model:
mongoose.model('User', UserSchema)
當要使用這個 model 只要用
mongoose.model()
將 model 讀出來,便可以對他進行操作了:var User = mongoose.model('User') User.getUserByLogin(login, function(err, user) { // here we have a user... })
-
1111111111111111111111111111111111111111111111111111111