Mongoose是在node.js環境下對mongodb進行便捷操作的物件模型工具
安裝
一開始需要安裝node.js環境以及mongodb資料庫,然後建立mongdb資料資料夾並且啟動mongdb(windows安裝啟動mongodb)。
connect
connect 用於連線資料庫
mongoose.connect(uri(s), [options], [callback])
//url(s):資料庫地址,可以是多個,以`,`隔開
//options:可選,配置引數
//callback:可選,回撥
// 規則
mongoose.connect(`mongodb://資料庫地址(包括埠號)/資料庫名稱`)
// 連線mongodb示例
mongoose.connect(`mongodb://localhost:27017/db`); //連線本地預設27017埠的mongodb
//連線指定使用者連線示例
mongoose.connect(`mongodb://使用者名稱:密碼@127.0.0.1:27017/資料庫名稱`)
//連線多個資料庫示例
//如果你的app中要連線多個資料庫,只需要設定多個url以,隔開,同時設定mongos為true
mongoose.connect(`urlA,urlB,...`, {
mongos : true
})
建立schema & model
schema
schema可以理解為mongoose對錶結構的定義(不僅僅可以定義文件的結構和屬性,還可以定義文件的例項方法、靜態模型方法、複合索引等),每個schema會對映到mongodb中的一個collection,schema不具備運算元據庫的能力
const mongoose = require(`mongoose`);
const {Schema} = mongoose;
// 使用者物件模型
const userSchema = new Schema({
name: {
type: String, //型別
default: Date.now // 預設值
},
avatar: {
type: String,
required: true //必須有值
},
user: String,
passworld: String,
hash: String,
score: Number,
learn: Array,
message: Array,
star: Array,
sign: Array,
signdate: String,
isregister: Boolean,
});
schema欄位型別
- String
- Number
- Date
- Buffer
- Boolean
- Mixed
- ObjectId
- Array
Model
Model是由Schema編譯而成的假想(fancy)構造器,具有抽象屬性和行為。Model的每一個例項(instance)就是一個document。document可以儲存到資料庫和對資料庫進行操作。
//建立並匯出model
const db= {
User: mongoose.model(`MUser`, muserSchema),
};
module.exports = db;
現在我們就完成了mongodb的資料連線,資料物件模型的建立。
操作mongodb資料庫
引入之前匯出的模型mongodb資料const db = require(`../models/db`)
mongodb查詢
1.find
find用來查詢並輸出該條件下的所有文件db.Userl.find({conditions}, {options}, callback)
conditions Object型別 //查詢條件
options Object 型別 //查詢配置引數
callback Function //回撥
查詢操作示例
// 查詢Article模型下所有資料
db.Article.find({}, function(err, docs){
if (err) {
console.log(`出錯`+ err);
return;
}
res.json(docs); // 以json格式輸出
});
// 查詢Article模型下state欄位為`publish`的內容,並且不輸出articleContent和user欄位內容。注!(1為只輸出該欄位,0為不輸出該欄位)
db.Article.find({state: "publish"}, {articleContent: 0,user: 0}, function(err, docs){
if (err) {
console.log(`出錯`+ err);
return;
}
res.json(docs);
});
//查詢閱讀量大於500小於600的文章
db.Article.find(({views: {$gte: 500, $lte: 600}}), function(err, docs){
if (err) {
console.log(`出錯`+ err);
return;
}
res.json({data:docs});
})
// 複雜條件查詢
//$ro 查詢該模型下的title欄位或者tag欄位,$regex 為正則匹配實現模糊查詢,$options為不區分大小寫
db.Article.find({ $or: [{title: {$regex: searchval, $options:`i`} }, { tag: {$regex: searchval, $options:`i` }}] }}, function(err, docs){
if (err) {
console.log(`出錯`+ err);
return;
}
res.json({data:docs});
})
條件查詢
- $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個元素
2.findOne
與find類似,但只返回單個文件
db.Article.findOne({title: req.body.title}, function(err, docs){
if (err) {
console.log(`出錯`+ err);
}
res.json(docs);
})
3.findById
與findOne類似,但它接收文件的 _id 作為引數,返回單個文件。_id 可以是字串或 ObjectId 物件。
db.Article.findOne(id, function(err, docs){
if (err) {
console.log(`出錯`+ err);
}
res.json(docs);
})
4.count
返回符合條件的文件數。
db.Article.count(id, function(err, docs){
if (err) {
console.log(`出錯`+ err);
}
res.json(docs);
})
5.where
當查詢比較複雜時,用 where:
db.Article.where(`age`).gte(25)
.where(`tags`).in([`movie`, `music`, `art`])
.select(`name`, `age`, `tags`)
.skip(20)
.limit(10)
.asc(`age`)
.slaveOk()
.hint({ age: 1, name: 1 })
.run(function(err, docs){
if (err) {
console.log(`出錯`+ err);
}
res.json(docs);
}));
$where
有時我們需要在 mongodb 中使用 javascript 表示式進行查詢,這時可以用 find({$where : javascript})
方式,$where 是一種快捷方式,並支援鏈式呼叫查詢。
db.MUser.$where(`this.firstname === this.lastname`).exec((err, docs) => {
res.json({docs});
});
sort & skip & limit
sort為排序方法,為該欄位正序或者倒序輸出內容(-1為倒序)
skip為跳過多少條目
limit 為限制輸出多少條
// 實現文章分頁,按時間倒序排列輸出
db.Article.find({tag:req.params.labe}, function(err, docs){
if (err)return;
res.json(docs)
}).sort({date:-1}).skip(page*pagenum).limit(pagenum)
mongodb增加
save是一個例項方法,使用時需要先 new Model() 來例項化
//儲存一個使用者資訊,userobj為你建立的文件物件模型裡的欄位,需正確對應傳入
const userobj={
email: query,
passworld: req.body.passworld,
hash: hash,
isregister: false,
score: 5,
sign: [],
signdate: ``
}
new db.MUser(userobj).save(function(error){
if (error) {
res.status(500).send()
return
}
res.json({statu: 200})
})
mongodb刪除
remove
刪除資料方法
db.Course.remove({_id: req.body.id}, function(err, docs){
if (err) {
res.status(500).send();
return
}
res.json({statu: 200})
})
mongodbg更新
update
更新資料方法
// 更新指定email欄位資料條目下欄位為content的內容,如果不存在就建立該欄位
db.Share.update({email: email},{$set:{content: newarr}}, function(err, docs){
if (err) {
res.status(500).send();
return
}
res.json({statu: 200});
})
//$set 指定欄位的值,這個欄位不存在就建立它。可以是任何MondoDB支援的型別。
Article.update({_id : id}, {$set : {views : 51, title : ‘修改後的標題’ …}})
//$unset 同上取反,刪除一個欄位
Article.update({views : 50}, {$unset : {views : ‘remove’}})
//執行後: views欄位不存在
//$inc 增減修改器,只對數字有效。
Article.update({_id : id}, {$inc : {views : 1}})
//$push 為欄位為陣列的內容push資料
Article.update({_id : id}, {$push : {message : messageobj}})
//$pop從頭部或尾部刪除單個元素(1為從後面刪除,-1為從前面刪除)
db.Article.update(({_id: id), {$pop:{relationships: -1})
//__$pull__刪除滿足條件的元素,不止刪除一個
db.Article.update(({_id: id), {$pull:{“relationships”:{“fname”:”dongren”, ”lname”: ”zeng”}}})
$set 指定欄位的值,這個欄位不存在就建立它。可以是任何MondoDB支援的型別。
Article.update({_id : id}, {$set : {views : 51, title : `修改後的標題` ...}})
$unset 同上取反,刪除一個欄位
Article.update({views : 50}, {$unset : {views : `remove`}})
//執行後: views欄位不存在
$inc 增減修改器,只對數字有效。
Article.update({_id : id}, {$inc : {views : 1}})
$push 為欄位為陣列的內容push資料
Article.update({_id : id}, {$push : {message : messageobj}})
$pop 從頭部或尾部刪除單個元素(1為從後面刪除,-1為從前面刪除)
db.Article.update(({_id: id), {$pop:{relationships: -1})
$pull 刪除滿足條件的元素,不止刪除一個
db.Article.update(({_id: id), {$pull:{“relationships”:{“fname”:”dongren”, ”lname”: ”zeng”}}})