Mongoose框架使用

Mongoose是在node.js異步環(huán)境下對mongodb進行便捷操作的對象模型工具

mongoose安裝

npm install mongoose

安裝成功后如下圖:


安裝成功后笆檀,就可以通過 require('mongoose') 來使用!

連接字符串

創(chuàng)建一個db.js

var mongoose = require('mongoose'), 

DB_URL = 'mongodb://localhost:27017/mongoosesample'; /** * 連接 */ 

mongoose.connect(DB_URL); /** * 連接成功 */ 

mongoose.connection.on('connected', function () { 

console.log('Mongoose connection open to ' + DB_URL); }); /** * 連接異常 */ 

mongoose.connection.on('error',function (err) { 

console.log('Mongoose connection error: ' + err); }); /** * 連接斷開 */ 

mongoose.connection.on('disconnected', function () { 

console.log('Mongoose connection disconnected'); });

調用node db.js執(zhí)行就會看到輸出如下圖

從代碼中可以看出复唤,監(jiān)聽了幾個事件像樊,并且執(zhí)行觸發(fā)了connected事件倡蝙,這表示連接成功。

connection中不止有如上幾個事件踢步,關鍵看你想要監(jiān)聽哪個事件癣亚。

其它事件可以自行查看:http://mongoosejs.com/docs/api.html#connection_Connection

這是最簡單的連接字符串,當然還有其它形式获印,比如:連接密碼述雾、數(shù)據(jù)庫連接設置、集群方式連式等等兼丰,這里解釋了玻孟,用著了時候自行查詢API文檔

http://mongoosejs.com/docs/api.html#index-js

Schema

schema是mongoose里會用到的一種數(shù)據(jù)模式,可以理解為表結構的定義鳍征;每個schema會映射到mongodb中的一個collection黍翎,它不具備操作數(shù)據(jù)庫的能力

我們先改造一下db.js,導出mongoose對象

var mongoose = require('mongoose'), 

DB_URL = 'mongodb://localhost:27017/mongoosesample'; /** * 連接 */ 

mongoose.connect(DB_URL); /** * 連接成功 */ 

mongoose.connection.on('connected', function () { 

console.log('Mongoose connection open to ' + DB_URL); }); /** * 連接異常 */ 

mongoose.connection.on('error',function (err) { 

console.log('Mongoose connection error: ' + err); }); /** * 連接斷開 */ 

mongoose.connection.on('disconnected', function () { 

console.log('Mongoose connection disconnected'); }); 

module.exports = mongoose;

下面我們定義一個user的Schema艳丛,命名為user.js

/** * 用戶信息 */ 
var mongoose = require('./db.js'), 
Schema = mongoose.Schema; 
var UserSchema = new Schema({ username : { type: String }, //用戶賬號 
userpwd: {type: String}, //密碼
 userage: {type: Number}, //年齡 
logindate : { type: Date} //最近登錄時間 
});

定義一個Schema就這么簡單匣掸,指定字段名和類型

Schema Types內置類型如下:

String

Number

Boolean | Bool

Array

Buffer

Date

ObjectId | Oid

Mixed

Model

定義好了Schema趟紊,接下就是生成Model。

model是由schema生成的模型碰酝,可以對數(shù)據(jù)庫的操作

我們對上面的定義的user的schema生成一個User的model并導出织阳,修改后代碼如下

/** * 用戶信息 */ 
var mongoose = require('./db.js'), 
Schema = mongoose.Schema; 
var UserSchema = new Schema({ username : { type: String }, //用戶賬號 
userpwd: {type: String}, //密碼 
userage: {type: Number}, //年齡 
logindate : { type: Date} //最近登錄時間 
}); 
module.exports = mongoose.model('User',UserSchema);

常用數(shù)據(jù)庫操作

接下來創(chuàng)建一個test.js文件做一些常用操作演示。

  插入

Model#save([fn])

var User = require("./user.js");
 /** * 插入 */ 
function insert() { 
var user = new User({ username : 'Tracy McGrady', //用戶賬號 
userpwd: 'abcd', //密碼
userage: 37, //年齡 
logindate : new Date() //最近登錄時間 });
user.save(function (err, res) {
 if (err) { 
console.log("Error:" + err);
 } else { 
console.log("Res:" + res); 
} 
}); 
} 
insert();

結果在robmongo工具中查看

從圖中可以看到插入成功砰粹!

更新

  Model.update(conditions, update, [options], [callback])

var User = require("./user.js"); 
function update(){ 
var wherestr = {'username' : 'Tracy McGrady'}; 
var updatestr = {'userpwd': 'zzzz'}; 
User.update(wherestr, updatestr, function(err, res){ 
if (err) { 
console.log("Error:" + err); 
} else { 
console.log("Res:" + res); 
}
 })
 } 
update();

根據(jù)用戶名更新密碼,執(zhí)行后結果如圖

圖中可以看出造挽,密碼更新成功碱璃!update方法基本可以滿足所有更新!

常用方法還有findByIdAndUpdate饭入,這種比較有指定性嵌器,就是根據(jù)_id

Model.findByIdAndUpdate(id, [update], [options], [callback])

var User = require("./user.js"); 
function findByIdAndUpdate(){ 
var id = '56f2558b2dd74855a345edb2'; 
var updatestr = {'userpwd': 'abcd'}; 
User.findByIdAndUpdate(id, updatestr, function(err, res){ 
if (err) { 
console.log("Error:" + err); 
} else { 
console.log("Res:" + res); 
} 
}) 
} 
findByIdAndUpdate();

其它更新方法

Model.findOneAndUpdate([conditions], [update], [options][callback])      //找到一條記錄并更新

刪除

Model.remove(conditions, [callback])

var User = require("./user.js"); 
function del(){ 
var wherestr = {'username' : 'Tracy McGrady'}; User.remove(wherestr, function(err, res){ 
if (err) { 
console.log("Error:" + err); 
} else { 
console.log("Res:" + res); 
} 
}) 
} 
del();

結果就不貼了,res中會返回是否成功以及影響的行數(shù):{"ok":1,"n":1}

其它常用方法還有:

Model.findByIdAndRemove(id, [options], [callback])      

Model.findOneAndRemove(conditions, [options], [callback])

條件查詢

已先插入一些測試數(shù)據(jù) 谐丢。爽航。

Model.find(conditions, [fields], [options], [callback])

var User = require("./user.js"); 
function getByConditions(){ 
var wherestr = {'username' : 'Tracy McGrady'}; 
User.find(wherestr, function(err, res){ 
if (err) { 
console.log("Error:" + err); 
} else { 
console.log("Res:" + res); 
} 
}) 
} 
getByConditions();

結果我就不展示了

第2個參數(shù)可以設置要查詢輸出的字段,比如改成

var User = require("./user.js"); 
function getByConditions(){ 
var wherestr = {'username' : 'Tracy McGrady'}; 
var opt = {"username": 1 ,"_id": 0}; 
User.find(wherestr, opt, function(err, res){ 
if (err) { 
console.log("Error:" + err); 
} else { 
console.log("Res:" + res);
 } 
}) 
} 
getByConditions();

輸出只會有username字段,設置方法如上乾忱,1表示查詢輸出該字段讥珍,0表示不輸出

比如我要查詢年齡范圍條件應該怎么寫呢?

User.find({userage: {gte: 21,lte: 65}}, callback); //這表示查詢年齡大于等21而且小于等于65歲

其實類似的還有:

$or    或關系

$nor    或關系取反

$gt    大于

$gte    大于等于

$lt     小于

$lte    小于等于

$ne 不等于

$in 在多個值范圍內

$nin 不在多個值范圍內

$all 匹配數(shù)組中多個值

$regex  正則窄瘟,用于模糊查詢

$size   匹配數(shù)組大小

$maxDistance  范圍查詢衷佃,距離(基于LBS)

$mod   取模運算

$near   鄰域查詢,查詢附近的位置(基于LBS)

$exists   字段是否存在

$elemMatch  匹配內數(shù)組內的元素

$within  范圍查詢(基于LBS)

$box    范圍查詢蹄葱,矩形范圍(基于LBS)

$center 范圍醒詢氏义,圓形范圍(基于LBS)

$centerSphere  范圍查詢,球形范圍(基于LBS)

$slice    查詢字段集合中的元素(比如從第幾個之后图云,第N到第M個元素)

可能還有一些惯悠,沒什么印象,大家自行看看api _!

數(shù)量查詢

Model.count(conditions, [callback])

var User = require("./user.js");

function getCountByConditions(){
    var wherestr = {};
    
    User.count(wherestr, function(err, res){
        if (err) {
            console.log("Error:" + err);
        }
        else {
            console.log("Res:" + res);
        }
    })
}

getCountByConditions();

res會輸出數(shù)量竣况,也可以傳入條件做條件查詢克婶!

根據(jù)_id查詢

Model.findById(id, [fields], [options], [callback])

var User = require("./user.js"); 
function getById(){ 
var id = '56f261fb448779caa359cb73'; 
User.findById(id, function(err, res){ 
if (err) { 
console.log("Error:" + err); 
} else { 
console.log("Res:" + res); 
} 
}) 
} 
getById();

這個還是比較常用,要據(jù)ID得到數(shù)據(jù)丹泉!

模糊查詢

var User = require("./user.js"); 
function getByRegex(){ 
var whereStr = {'username':{$regex:/m/i}};
 User.find(whereStr, function(err, res){ 
if (err) { 
console.log("Error:" + err); 
} else { 
console.log("Res:" + res); 
} 
}) 
} 
getByRegex();

上面示例中查詢出所有用戶名中有'm'的名字鸠补,且不區(qū)分大小寫,模糊查詢比較常用嘀掸,正則形式匹配紫岩,正則方式就是javascript正則,用到的比較多睬塌!

分頁查詢

var User = require("./user.js");
 function getByPager(){ 
var pageSize = 5; //一頁多少條 
var currentPage = 1; //當前第幾頁 
var sort = {'logindate':-1}; //排序(按登錄時間倒序) 
var condition = {}; //條件 
var skipnum = (currentPage - 1) * pageSize; //跳過數(shù) User.find(condition).skip(skipnum).limit(pageSize).sort(sort).exec(function (err, res) {
if (err) { 
console.log("Error:" + err); 
} else { 
console.log("Res:" + res);
 } 
}) 
} 
getByPager();

分頁是用得比較多的查詢泉蝌,分頁原理用過其它數(shù)據(jù)庫的都知道歇万,分頁用到的函數(shù)和mysql的比較類似

上面我用到sort(),這個是排序規(guī)則,就不單講了勋陪!

其它操作

其它還有比較多常用的

索引和默認值

再看看我對user.js這個schema的修改

/** * 用戶信息 */ 
var mongoose = require('./db.js'), 
Schema = mongoose.Schema; 
var UserSchema = new Schema({ username : { type: String , index: true
}, //用戶賬號 
userpwd: {type: String}, //密碼 
userage: {type: Number}, //年齡 
logindate : { type: Date, default:Date.now} //最近登錄時間 
}); 
module.exports = mongoose.model('User',UserSchema);

index :建索引

default:默認值

LBS地址位置

lbs : { type: Array, index: '2d', sparse: true } //地理位置

上面有介紹過很多基于LBS的條件查詢贪磺,Schema中定義時如上

LBS查詢對于一些基于LBS應用會用得比較多。

其它常用方法

Model.distinct(field, [conditions], [callback]) //去重

Model.findOne(conditions, [fields], [options], [callback])  //查找一條記錄

Model.findOneAndRemove(conditions, [options], [callback]) //查找一條記錄并刪除

Model.findOneAndUpdate([conditions], [update], [options], [callback]) //查找一條記錄并更新

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末诅愚,一起剝皮案震驚了整個濱河市寒锚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌违孝,老刑警劉巖刹前,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異雌桑,居然都是意外死亡喇喉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門校坑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拣技,“玉大人,你說我怎么就攤上這事耍目「嘟铮” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵邪驮,是天一觀的道長掸绞。 經(jīng)常有香客問我,道長耕捞,這世上最難降的妖魔是什么衔掸? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮俺抽,結果婚禮上敞映,老公的妹妹穿的比我還像新娘。我一直安慰自己磷斧,他們只是感情好振愿,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著弛饭,像睡著了一般冕末。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侣颂,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天档桃,我揣著相機與錄音,去河邊找鬼憔晒。 笑死藻肄,一個胖子當著我的面吹牛蔑舞,可吹牛的內容都是我干的。 我是一名探鬼主播嘹屯,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼攻询,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了州弟?” 一聲冷哼從身側響起钧栖,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎婆翔,沒想到半個月后拯杠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡浙滤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了气堕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纺腊。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖茎芭,靈堂內的尸體忽然破棺而出揖膜,到底是詐尸還是另有隱情,我是刑警寧澤梅桩,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布壹粟,位于F島的核電站,受9級特大地震影響宿百,放射性物質發(fā)生泄漏趁仙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一垦页、第九天 我趴在偏房一處隱蔽的房頂上張望雀费。 院中可真熱鬧,春花似錦痊焊、人聲如沸盏袄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辕羽。三九已至,卻和暖如春垄惧,著一層夾襖步出監(jiān)牢的瞬間刁愿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工到逊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留酌毡,地道東北人克握。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像枷踏,于是被迫代替她去往敵國和親菩暗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354