<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [toc] ## 官方文檔 > [點擊跳轉](http://mongoosejs.com/) ## 安裝mongoose ``` npm install mongoose ``` ## 利用mongoose連接數據庫 - user 用戶名 - pass 密碼 - ip IP地址 - port 端口號 - database 數據庫 格式 ``` var mongoose = require("mongoose"); var db = mongoose.connect("mongodb://user:pass@ip:port/database"); ``` usage ``` let mongoose = require('mongoose'); let conn = mongoose.createConnection('mongodb://localhost/ahhh'); ``` ### 連接事件 ``` //如果說打開數據庫失敗,那么會觸發error事件 conn.on('err',function(err){ console.error('err:',err); }); //如果數據庫連接成功,成功的打開了數據庫,那么會觸發open事件 conn.on('open',function(err){ console.error('open',err); }) ``` ## Schema Schema是數據庫集合的模型骨架,定義了集合中的字段的名稱和類型以及默認值等信息。 ### Schema.Type NodeJS中的基本數據類型都屬于Schema.Type,另外Mongoose還定義了自己的類型 基本屬性類型有 - 字符串(String) - 日期型(Date) - 數值型(Number) - 布爾型(Boolean) - null - 數組([]) - 內嵌文檔 ### 定義Schema ``` var personSchema = new Schema({ name:String, //姓名 binary:Buffer,//二進制 living:Boolean,//是否活著 birthday:Date,//生日 age:Number,//年齡 _id:Schema.Types.ObjectId, //主鍵 _fk:Schema.Types.ObjectId, //外鍵 array:[],//數組 arrOfString:[String],//字符串數組 arrOfNumber:[Number],//數字數組 arrOfDate:[Date],//日期數組 arrOfBuffer:[Buffer],//Buffer數組 arrOfBoolean:[Boolean],//布爾值數組 arrOfObjectId:[Schema.Types.ObjectId]//對象ID數組 nested:{ //內嵌文檔 name:String, } }); ``` ``` //第二個參數用來定義集合的名稱,不寫會生成一個默認的 //注意,這里還沒有真正創建集合,而是要在調用modle方法時,并且集合的名字也是在那時決定的 let PersonSchema = new mongoose.Schema({ name:String ,age:Number },{collection:'person'}) ``` - 如果對象中的字段在Schema中沒有定義,則會被忽略掉 - 如果說對象中的字段少于Schema中定義的字段,則缺少的字段不會被保存 - 如果提供的字段類型和Schema中定義的不匹配,則會報錯 ### Model `Model`是通過`Schema`構造而成,除了具有Schema定義的數據庫骨架以外,還可以操作數據庫 ``` //連接數據庫 mongoose.connect("mongodb://123.57.143.189:27017/ahhh"); //兩個參數表示定義一個模型 var PersonModel = mongoose.model("Person", PersonSchema); // 如果該Model已經定義,則可以直接通過名字獲取 var PersonModel = mongoose.model('Person');//一個參數表示獲取已定義的模型 ``` 擁有了Model,我們也就擁有了操作數據庫的能力 >[danger] **注意:** 在數據庫中的集合名稱等于 模型名轉小寫再轉復數,比如 > > Person>person>people,Child>child>children > Xxx=>xxxs ### Entity實體 通過Model創建的實體,可以操作數據庫 ``` var personEntity = new PersonModel({ name : "ahhh", age : 111 }); ``` >[warning] Schema生成Model,Model創造Entity,**Model和Entity都可對數據庫操作**,但Model比Entity可以實現的功能更多 ### 保存Entity ``` var mongoose = require("mongoose"); mongoose.connect("mongodb://127.0.0.1:27017/zfpx"); var PersonSchema = new mongoose.Schema({ name: {type: String}, age: {type: Number, default: 0} }); var PersonModel = mongoose.model("Person", PersonSchema); var PersonEntity = new PersonModel({ name: "ahhh", age: 111 }); PersonEntity.save(function (error, doc) { if (error) { console.log("error :" + error); } else { //doc是返回剛存的person對象 console.log(doc); } }); ``` ### ObjectId 存儲在mongodb集合中的每個文檔都有一個默認的主鍵_id 這個主鍵名稱是固定的,它可以是mongodb支持的任何數據類型,默認是ObjectId 該類型的值由系統自己生成,從某種意義上幾乎不會重復 ObjectId是一個12字節的 BSON 類型字符串。按照字節順序,依次代表: - 4字節:UNIX時間戳 - 3字節:表示運行MongoDB的機器 - 2字節:表示生成此_id的進程 - 3字節:由一個隨機數開始的計數器生成的值 >每一個文檔都有一個特殊的鍵_id,這個鍵在文檔所屬的集合中是唯一的。 ## 基礎操作 ### 查詢 >語法 >Model.find(查詢條件,callback); ``` Model.find({},function(error,docs){ //若沒有向find傳遞參數,默認的是顯示所有文檔 }); Model.find({ "age": 111 }, function (error, docs) { if(error){ console.log("error :" + error); }else{ console.log(docs); //docs: age為111的所有文檔 } }); ``` ### Model保存 >語法 >Model.create(查詢條件,callback); ``` PersonModel.create({ name:"ahhh", age:111}, function(error,doc){ if(error) { console.log(error); } else { console.log(doc); } }); ``` ### Entity保存 >語法 >Entity.save(callback)) ``` var PersonEntity = new PersonModel({name:"ahhh",age: 111}); PersonEntity.save(function(error,doc) { if(error) { console.log(error); } else { console.log(doc); } }); ``` ### 更新 >語法 >Model.update(查詢條件,更新對象,callback); 原生中會整體覆蓋,但mongoose中沒有這個問題,即使傳入了整個文檔,也不會直接覆蓋原文檔,也是按字段覆蓋 并且原生中的`$`操作符都能用 ``` var conditions = {name : 'ahhh'}; var update = {$set : { age : 100 }}; PersonModel.update(conditions, update, function(error){ if(error) { console.log(error); } else { console.log('Update success!'); } }); ``` 請注意如果匹配到多條記錄,默認只更新一條,如果要更新匹配到的所有記錄的話需要(在回調)加一個參數` {multi:true}` ### 刪除 >語法 >Model.remove(查詢條件,callback); ``` var conditions = { name: 'ahhh' }; PersonModel.remove(conditions, function(error){ if(error) { console.log(error); } else { console.log('Delete success!'); } }); ``` 如果只想刪除匹配的第一條的話,需要(在回調之前)添加`{justOne:true}`參數 ### 基本查詢 #### 屬性過濾 >語法 >find(Conditions,field,callback) ``` //field省略或為Null,則返回所有屬性。 //返回只包含name、age兩個鍵的所有記錄 Model.find({},{name:1, age:1, _id:0},function(err,docs){ //docs 查詢結果集 }) ``` 我們只需要把顯示的屬性設置為大于零的數就可以,當然1是最好理解的,_id是默認返回,如果不要顯示加上`("_id":0)` #### findOne(查詢單條) >語法 >findOne(Conditions,callback) find相同,但只返回單個文檔,也就說當查詢到即一個符合條件的數據時,將停止繼續查詢,并返回查詢結果 語法 ``` TestModel.findOne({ age: 111}, function (err, doc){ // 查詢符合age等于6的第一條數據 // doc是查詢結果 }); ``` #### findById(按ID單條數據) >語法 >findById(_id, callback) 與findOne相同,但它只接收文檔的_id作為參數,返回單個文檔 語法 與原生不同的是,原生需要使用`ObjectId()` ``` PersonModel.findById(person._id, function (err, doc){ //doc 查詢結果文檔 }); ``` #### $gt、$lt(大于、小于) 查詢時我們經常會碰到要根據某些字段進行條件篩選查詢,比如說Number類型,怎么辦呢,我們就可以使用$gt(>)、$lt(<)、$lte(<=)、$gte(>=)操作符進行排除性的查詢,如下示例: ``` Model.find({"age":{"$gt":6}},function(error,docs){ //查詢所有nage大于6的數據 }); Model.find({"age":{"$lt":6}},function(error,docs){ //查詢所有nage小于6的數據 }); Model.find({"age":{"$gt":6,"$lt":9}},function(error,docs){ //查詢所有nage大于6小于9的數據 }); ``` #### $ne(不等于) $ne(!=)操作符的含義相當于不等于、不包含,查詢時我們可通過它進行條件判定,具體使用方法如下: ``` Model.find({ age:{ $ne:6}},function(error,docs){ //查詢age不等于6的所有數據 }); ``` #### $in(包含) 和$ne操作符相反,$in相當于包含、等于,查詢時查找包含于指定字段條件的數據 ``` Model.find({ age:{ $in: 6}},function(error,docs){ //查詢age等于6的所有數據 }); Model.find({ age:{$in:[6,7]}},function(error,docs){ //可以把多個值組織成一個數組 }); ``` #### $or(或者) 可以查詢多個鍵值的任意給定值,只要滿足其中一個就可返回,用于存在多個條件判定的情況下使用,如下示例: ``` Model.find({"$or":[{"name":"zfpx"},{"age":6}]},function(error,docs){ //查詢name為zfpx或age為6的全部文檔 }); ``` #### $exists(是否存在) $exists操作符,可用于判斷某些關鍵字段是否存在來進行條件查詢。如下示例: ``` Model.find({name: {$exists: true}},function(error,docs){ //查詢所有存在name屬性的文檔 }); Model.find({email: {$exists: false}},function(error,docs){ //查詢所有不存在email屬性的文檔 }); ``` ### 高級查詢 可以限制結果的數量,跳過部分結果,根據任意鍵對結果進行各種排序 所有這些選項都要在查詢被發送到服務器之前指定 #### limit(限制數量) >語法 >find(Conditions,fields,options,callback); 在查詢操作中,有時數據量會很大,這時我們就需要對返回結果的數量進行限制 那么我們就可以使用limit函數,通過它來限制結果數量。 語法 ``` Model.find({},null,{limit:20},function(err,docs){ console.log(docs); }); ``` 如果匹配的結果不到20個,則返回匹配數量的結果,也就是說limit函數指定的是上限而非下限 #### skip(跳過/略過的數量) >語法 >find(Conditions,fields,options,callback); skip函數的功能是略過指定數量的匹配結果,返回余下的查詢結果 如下示例: ``` Model.find({},null,{skip:4},function(err,docs){ console.log(docs); }); ``` 如果查詢結果數量中少于4個的話,則不會返回任何結果。 #### sort函數 >語法 >find(Conditions,fields,options,callback) sort函數可以將查詢結果數據進行排序操作 該函數的參數是一個或多個鍵/值對 鍵代表要排序的鍵名,值代表排序的方向,1是升序,-1是降序 語法 ``` Model.find({},null,{sort:{age:-1}},function(err,docs){ //查詢所有數據,并按照age降序順序返回數據docs }); ``` sort函數可根據用戶自定義條件有選擇性的來進行排序顯示數據結果。 #### 分頁查詢 ``` Model('User').find({}) .sort({createAt:-1}) .skip((pageNum-1)*pageSize) .limit(pageSize) .populate('user') .exec(function(err,docs){ console.log(docs); }); ``` #### populate 連表查詢 ``` var mongoose = require('mongoose'); //連接數據庫 mongoose.connect('mongodb://localhost:27017/201606blog'); //定義課程Schema var CourseSchema = new mongoose.Schema({ name:String }); var CourseModel = mongoose.model('Course',CourseSchema); var PersonSchema = new mongoose.Schema({ name:{ type:String, required:true }, // 外鍵 別的集合的主鍵 course:{ type:mongoose.Schema.Types.ObjectId, ref:'Course' //指明此外鍵是哪個集合中的外鍵 } }); var PersonModel = mongoose.model('Person',PersonSchema); CourseModel.create({name:'node.js'},function(err,course){ PersonModel.create({name:'ahhh',course:course._id},function(err,doc){ console.log(doc); PersonModel.findById(doc._id).populate('course').exec(function(err,doc){ console.log(doc); //連表查詢后的結果 }) }) }); ``` ## 擴展mongoose模型 ### statics 對類進行擴展 根據用戶名查找用戶文檔 ``` //this指向model PersonSchema.statics.findByUsername = function (username, callback) { return this.findOne({ username }, callback); } Person.findByUsername('ahhh', function (err, doc) { console.log(doc); }); ``` ### methods對實例進行擴展 ``` PersonSchema.methods.exist = function (callback) { let query = { username: this.username, password: this.password }; return this.model('Person').findOne(query, callback); } let person = new Person({ username: 'ahhh', password: '123456', phone: '010-6255889', firstname: 'first', lastname: 'last' }); person.exist(function (err, doc) { console.log(err, doc); }); ``` ### virtual - virtual是虛擬屬性的意思,即原來Schema定義里是不存在該屬性,后來通過virutal方法賦予的屬性。 - Schema中定義的屬性是要保存到數據庫里的,而virtual屬性基于已有屬性做的二次定義。 模型屬性 = Schema定義的屬性+virtual屬性 ``` PersonSchema.virtual('area').get(function () { //this指向實例 return this.phone.split('-')[0]; }); PersonSchema.virtual('number').get(function () { return this.phone.split('-')[1]; }); let Person = conn.model('Person', PersonSchema); let person = new Person({ username: 'ahhh', password: '123456', phone: '010-6255889', firstname: 'first', lastname: 'last' }); console.log(person.fullname, person.area, person.number); ``` ### hook 在用戶注冊保存的時候,需要先把密碼通過salt生成hash密碼,并再次賦給password ``` PersonSchema.pre('save', function (next) { //this指向實例 this.password = crypto.createHmac('sha256', 'ahhh').update(this.password).digest('hex'); next(); }); PersonSchema.statics.login = function (username, password, callback) { password = crypto.createHmac('sha256', 'ahhh').update(password).digest('hex'); return this.findOne({ username, password }, callback); } Person.login('ahhh', '123456', function (err, doc) { console.log(err, doc); }); ``` ### schema 插件 Schemas是可插拔的,也就是說,它們提供在應用預先打包能力來擴展他們的功能。 ``` module.exports = exports = function lastModified(schema,options){ schema.add({lastModify:Date}); schema.pre('save',function(next){ this.lastModify = new Date; next(); }); if(options&& options.index){ schema.path('lastModify').index(options.index); } } ``` ``` let plugin = require('./plugin'); let Person = new Schema({}); Person.plugin(plugin,{index:true}); ``` - Person 是用戶自己定義的Schema - Person.plugin 是為Person增加plugin - plugin有2個參數 - 插件對象 plugin - 配置項 {index:true} ``` schema.add({age:Number}); //往schema里添加一個驗證字段 ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看