vue2.0開發聊天程序(七) mongoose操做

鏈接

開啓你的mongodb服務

首先確保你已安裝了mongodb,而且配置了mongodb的環境變量。
在任意目錄(建議在非中文目錄)下新建database文件夾,在此文件夾下新建test文件夾(確保此文件夾爲空的)。
而後打開cmd,輸入:java

mongod --dbpath 'test文件夾的絕對路徑———— E:\database\test'

clipboard.png

waiting for connections on port 27017 說明你已經在localhost:27017端口上開啓了服務。

此時再進入test文件夾,裏面會有許多WT文件。node

建立鏈接

新建一個index.js(任意目錄,最好新建一個mongodbDemo文件夾便於管理)。正則表達式

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
var db = mongoose.connection;


db.on('error',console.error.bind(console,'mongodb鏈接錯誤:'));
db.once('open',function(){
    console.log('mongodb connection is OK!');
});

安裝mongoose依賴包,運行此文件mongodb

npm install mongoose

node index.js

clipboard.png

說明已成功鏈接到數據庫。數據庫

寫入第一條數據 Create

mongoose寫入數據的方法有兩個,分別是Model.create()和Documents.save()[即上文的Entity];npm

1.在寫入數據以前,先新建一個model數組

var CatSchema = new mongoose.Schema({ // 新建一個model對象
    name: String
});
var CatModel = mongoose.model('Cat', CatSchema); // 這一步才正式寫入數據庫,數據庫對應的model名爲Cat

2.插入一條數據promise

//Model.create
CatModel.create({name: 'ketty'},function(err,res){ // 第一個參數規定爲錯誤信息
    console.log(err);
    console.log(res);
})

//promise寫法
CatModel.create({
    name: 'kitty'
}).then(res=>{console.log(res)}) // 成功返回當前數據
.catch(err=>{console.log(err)});

// Documents.save()
var catDoc = new CatModel({name:'ketty'});

catDoc.save(function (err, res) {
    if (err)console.log(err);
    console.log(res);
  });

基於Model的查詢

簡單查詢

Model.find().then(res=>{ // 傳空匹配全部
    log(res);
}).catch(err=>{
    log(err);
});

Model.find({name: 'kitty'}).then(res=>{ // 匹配name爲kitty的全部數據
    log(res); // 若爲查詢到數據 res爲[]
}).catch(err=>{
    log(err);
});

Model.findOne({name: 'kitty'}).then(res=>{ // 匹配name爲kitty的第一條數據
    log(res); // 若爲查詢到數據 res爲null
}).catch(err=>{
    log(err);
});

Model.findById(id).then(res=>{// 根據id查詢
    // tido
}).catch(err=>{
    // tido
})

find和findOne只接受Object做爲參數,若是未傳參數則默認爲{}。傳其餘數據類型都會拋出異常mongoose

條件查詢

「$lt」 小於
「$lte」 小於等於
「$gt」 大於
「$gte」 大於等於
「$ne」 不等於函數

// 查詢 age 大於等於18並小於等於30的文檔
Model.find({'age':{ '$get':18 , '$lte':30 } } );

或查詢

‘$in’ 一個鍵對應多個值
‘$nin’ 同上取反, 一個鍵不對應指定值
「$or」 多個條件匹配, 能夠嵌套 $in 使用
「$not」 同上取反, 查詢與特定模式不匹配的文檔

// 查詢 age等於20或21或21或’haha’的文檔
Model.find({'age':{ '$in':[20,21,22.'haha']} } );

// 查詢 age等於18 或 name等於’xueyou’ 的文檔
 Model.find({'$or' :  [ {'age':18} , {'name':'xueyou'} ] });

類型查詢

"$exists" 是否存在某屬性

null 能匹配自身和不存在的值, 想要匹配鍵的值爲null, 就要經過 「$exists」 條件斷定鍵值已經存在

// 查詢 age值爲null的文檔
Model.find('age' :  { '$in' : [null] , 'exists' : true  } );

//查詢全部存在name屬性的文檔
Model.find({name: {$exists: true}});

//查詢全部不存在telephone屬性的文檔
Model.find({telephone: {$exists: false}});

正則表達式

MongoDb 使用 Prel兼容的正則表達式庫來匹配正則表達式

// 查詢name爲 joe 的文檔, 並忽略大小寫
Model.find( {'name' : /joe/i } )    

//查詢匹配各類大小寫組合
Model.find( {'name' : /joe?/i } )

查詢數組

‘$all’ 匹配數組中多個元素
‘$size’ 匹配數組長度
‘$slice’ 查詢子集合返回

// 查詢 array(數組類型)鍵中有10的文檔,  array : [1,2,3,4,5,10]  會匹配到
Model.find({'array':10} );

//查詢 array(數組類型)鍵中下標5對應的值是10,  array : [1,2,3,4,5,10]  會匹配到
Model.find({'array[5]':10} );

//查詢 匹配array數組中 既有5又有10的文檔
Model.find({'array':[5,10]} );

// 查詢 匹配array數組長度爲3 的文檔
Model.find({'array':{'$size' : 3} } );

// 查詢 匹配array數組的前10個元素
Model.find({'array':{'$skice' : 10} } );

//查詢 匹配array數組的第5個到第10個元素

Model.find({'array':{'$skice' : [5,10] } } );

Where_javacript語句查詢

用$where能夠執行任意javacript語句做爲查詢的一部分,若是回調函數返回 true 文檔就做爲結果的一部分返回

Model.find({"$where": function() {
        if (this.x !== null && this.y !== null) {
            return this.x + this.y === 10 ? true : false; // retrun將替代返回結果
        } else {
            return true;
        }
    }
})

Model.find( {"$where" :  "this.x + this.y === 10" } ) // this指向Model
Model.find( {"$where" : " function(){ return this.x + this.y ===10; } " } )

聯表查詢

要實現聯表查詢須要將鏈接的Model的主鍵_id指向須要對應Model的某個屬性上。使用populate進行查詢
實現方法以下:

// *****************建立Model************
var cityModel= mongoose.model('city', {
    cityName: String,
    townList: []
});
var countryModel = mongoose.model('country', {
    country: String,
    cityList:[{
           type: mongoose.Schema.ObjectId,
        ref: 'city'  // 將'sity'Model的主鍵與country的cityList對應
    }]
});

// ****************插入數據************************
cityModel.create({cityName:'shanghai',townList:['lujiazui']});
cityModel.create({cityName:'guangzhou',townList:['tianhe']});
cityModel.create({cityName:'beijing',townList:['zhaoyang']});

var countryObj = {
    country:'china',
    cityList:[]
}
cityModel.find().then(res=>{  //將全部數據查出,並將對應的_id存入數組
    for(let i in res){
        countryObj.cityList.push(res[i]._id);
    }
    // 插入國家數據
    countryModel.create(countryObj,function(err,res){
        console.log(err);
        console.log('res' + res);
    }); 
});

// ****************查詢結果**********************
countryModel.find().then(res=>{ // 普通查詢
        console.log(res);
}).catch(err=>{
    console.log(err);
})
/*結果爲
[ { cityList:
     [ 5a4ded2b78110500d8b94726,
       5a4ded2b78110500d8b94725,
       5a4ded2b78110500d8b94727 ],
    _id: 5a4df149c249713348a2f546,
    country: 'china',
    __v: 0 } ]
*/
countryModel.find({country: 'china'}).populate('cityList').then(res=>{ // populate查詢
        console.log(res);
})
/*
[ { cityList: [ [Object], [Object], [Object] ],
    _id: 5a4df149c249713348a2f546,
    country: 'china',
    __v: 0 } ]
*/

遊標

limit(3) 限制返回結果的數量
skip(3) 跳過前3個文檔,返回其他的
sort( 'username':1 , 'age':-1 } ) 排序 鍵對應文檔的鍵名, 值表明排序方向, 1 升序, -1降序

更新數據

‘$inc’ 增減修改器,只對數字有效.下面的實例: 找到 age=22的文檔,修改文檔的age值自增1

Model.update({'age':22}, {'$inc':{'age':1}});

‘$set’ 指定一個鍵的值,這個鍵不存在就建立它.能夠是任何MondoDB支持的類型.

Model.update({'age':22}, {'$set':{'age':'haha'}});

‘$unset’ 刪除一個鍵

Model.update({‘age’:22}, {’$unset’:{‘age’:‘haha’} }  );

數組更新

‘$push’ 給一個鍵push一個數組成員,鍵不存在會建立

Model.update({'age':22}, {'$push':{'array':10} }  );

‘$addToSet’ 向數組中添加一個元素,若是存在就不添加

Model.update({'age':22}, {'$addToSet':{'array':10} }  );

‘$each’ 遍歷數組, 和 $push 修改器配合能夠插入多個值

Model.update({'age':22}, {'$push':{'array':{'$each': [1,2,3,4,5]}} }  );

‘$pop’ 向數組中尾部刪除一個元素

Model.update({'age':22}, {'$pop':{'array':1} }  );

‘$pull’ 向數組中刪除指定元素

Model.update({'age':22}, {'$pull':{'array':10} }  );

刪除

Model.remove(conditions,callback); // conditions爲查詢條件,可參考find
相關文章
相關標籤/搜索