[轉] Mongoose 使用

許久不用 MongoDB, 重新回顧一下

 

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

mongoose安裝

npm install mongoose

安裝成功後如下圖:

 

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

連接字符串

創建一個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執行就會看到輸出如下圖

從代碼中可以看出,監聽了幾個事件,並且執行觸發了connected事件,這表示連接成功。

connection中不止有如上幾個事件,關鍵看你想要監聽哪個事件。

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

這是最簡單的連接字符串,當然還有其它形式,比如:連接密碼、數據庫連接設置、集羣方式連式等等,這裏解釋了,用着了時候自行查詢API文檔

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

Schema

schema是mongoose裏會用到的一種數據模式,可以理解爲表結構的定義;每個schema會映射到mongodb中的一個collection,它不具備操作數據庫的能力

我們先改造一下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生成的模型,可以對數據庫的操作

我們對上面的定義的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);

常用數據庫操作

接下來創建一個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();

根據用戶名更新密碼,執行後結果如圖

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

常用方法還有findByIdAndUpdate,這種比較有指定性,就是根據_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中會返回是否成功以及影響的行數:{"ok":1,"n":1}

其它常用方法還有:

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

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

條件查詢

已先插入一些測試數據 。。

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個參數可以設置要查詢輸出的字段,比如改成

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: {lte: 65}}, callback); //這表示查詢年齡大於等21而且小於等於65歲

其實類似的還有:

$or    或關係

$nor    或關係取反

$gt    大於

$gte    大於等於

$lt     小於

$lte    小於等於

$ne 不等於

$in 在多個值範圍內

$nin 不在多個值範圍內

$all 匹配數組中多個值

$regex  正則,用於模糊查詢

$size   匹配數組大小

$maxDistance  範圍查詢,距離(基於LBS)

$mod   取模運算

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

$exists   字段是否存在

$elemMatch  匹配內數組內的元素

$within  範圍查詢(基於LBS)

$box    範圍查詢,矩形範圍(基於LBS)

$center 範圍醒詢,圓形範圍(基於LBS)

$centerSphere  範圍查詢,球形範圍(基於LBS)

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

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

數量查詢

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會輸出數量,也可以傳入條件做條件查詢!

根據_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();

這個還是比較常用,要據ID得到數據!

模糊查詢

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'的名字,且不區分大小寫,模糊查詢比較常用,正則形式匹配,正則方式就是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; //跳過數 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();

分頁是用得比較多的查詢,分頁原理用過其它數據庫的都知道,分頁用到的函數和mysql的比較類似

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

其它操作

其它還有比較多常用的

索引和默認值

再看看我對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]) //查找一條記錄並更新



作者:foreknow
鏈接:https://www.jianshu.com/p/4a16b315ae0a
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章