摘要:在做自己的一個(gè)小項(xiàng)目時(shí),新學(xué)習(xí)了非關(guān)系型數(shù)據(jù)庫,使用了封裝好的查詢方法,包括數(shù)據(jù)庫分頁用到的和方法,這里記錄下。
在做自己的一個(gè)小項(xiàng)目時(shí),新學(xué)習(xí)了mongodb非關(guān)系型數(shù)據(jù)庫,使用了mongoose封裝好的查詢方法,包括數(shù)據(jù)庫分頁用到的limit和skip方法,這里記錄下。1. mongodb數(shù)據(jù)庫連接
參照官網(wǎng)文檔對應(yīng)的參數(shù)如下:
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
使用mongoose進(jìn)行數(shù)據(jù)庫的連接
const dataBaseUrl = config.admin.username ? `mongodb://${config.admin.username}:${config.admin.pwd}@${config.host}/share-resource` : `mongodb://${config.host}/share-resource`; mongoose.connect(dataBaseUrl, { useNewUrlParser: true });
若出現(xiàn)警告信息:要求使用新的編譯方式,則在連接的時(shí)候加上useNewUrlParser: true
DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version.
To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.
mongoose.connect(dataBaseUrl, { useNewUrlParser: true });
在連接數(shù)據(jù)庫時(shí),對連接操作進(jìn)行監(jiān)聽處理
mongoose.connection.on("connected", function() { console.log("Mongoose connection open to " + dataBaseUrl); }); /* 連接數(shù)據(jù)庫異常 */ mongoose.connection.on("error", function(err) { console.log("Mongoose connection error:" + err); }); /* 連接數(shù)據(jù)庫斷開 */ mongoose.connection.on("disconnected", function() { console.log("Mongoose connection disconnected"); });2. 數(shù)據(jù)類型(mongoose中提供的schemaTypes)
數(shù)據(jù)類型有:String,Number,Date,Buffer,Boolean,ObjectId,Array,Mixed,Map,Decimal128
在數(shù)據(jù)庫直接用insert方法進(jìn)行數(shù)據(jù)插入時(shí),若不強(qiáng)制指定數(shù)字的類型,則默認(rèn)是插入double型數(shù)字
3. mongoose對數(shù)據(jù)庫操作的方法 3.1 數(shù)據(jù)的插入先要新建schema文件
const mongoose = require("../database/mongodbHelper"); const Message= mongoose.Schema; const RecordModel = new Message({ message: String, name: String, num: Number, },{ versionKey: false }); module.exports = mongoose.model("using_records", RecordModel);
在使用schema對進(jìn)行數(shù)據(jù)的插入時(shí),若直接插入,則會(huì)在新的集合中多出一個(gè)_v字段,這個(gè)代表的是集合的版本號(hào),可以在schema中加入versionKey: false來刪除_v字段
數(shù)據(jù)插入:使用save方法
const record= new Record({ message: req.body.message, name: req.body.name, num: req.body.num, }); record.save((err, docs) => { if (err) { res.send({ "status": -1, "msg": "插入失敗" }); } else { res.send({ "status": 200, "msg": "插入成功", "result": ""}); } });3.2 數(shù)據(jù)的查詢
使用find方法
record.find((err, docs) => { if (err) { res.send({ "status": -1, "msg": "參數(shù)錯(cuò)誤" }); } else { res.send({ "status": 200, "msg": "查詢成功", "result": docs}); } });3.3 數(shù)據(jù)的更新
更新一條數(shù)據(jù):updateOne
/* 第一個(gè)參數(shù)為查詢參數(shù),第二個(gè)為要更新的內(nèi)容,第三個(gè)為回調(diào)方法 */ record.updateOne({_id: id}, updateInfo, (err, doc) => { if(err) { res.send({"status": -1, "msg": "更新失敗", "result": ""}); } else { res.send({"status": 200, "msg": "更新成功", "result": ""}); } })
更新多條數(shù)據(jù):updateMany
record.updateMany({user_info: {$elemMatch: {user_id: userId, status: 1, is_delete: 1}}}, {$set: {"user_info.$.is_delete": 3}}, (err, doc) => { if(err) { res.send({"status": -1, "msg": "參數(shù)錯(cuò)誤"}); } else { res.send({"status": 200, "msg": "清空成功"}); } })3.4 數(shù)據(jù)的刪除
/* 第一個(gè)為要?jiǎng)h除的內(nèi)容的參數(shù) */ record.findOneAndDelete({_id: req.body.id}, (err, doc) => { if(err) { res.send({"status": -1, "msg": "刪除失敗"}); } else { res.send({"status": 200, "msg": "刪除成功"}); } })4. 數(shù)據(jù)庫的分頁操作(limit和skip方法)
limit()方法為限制數(shù)據(jù)庫每次查詢的數(shù)據(jù)條數(shù);skip(param)跳過param條數(shù)據(jù)不查詢
/* page: 頁碼;pagesize: 每頁的數(shù)量 */ let page = req.body.page; let pagesize = req.body.pagesize; let queryResult = collection.find(queryCondition).limit(pageSize).skip((page - 1) * pageSize).sort({"_id": -1}); queryResult.exec((err, value) => { if(err) { reject(err); } else { resolve({total, value}); } })5.匹配數(shù)據(jù)
匹配數(shù)據(jù)中的數(shù)組里的某個(gè)對象里的某個(gè)字段,使用$set來設(shè)置對應(yīng)的值
$set: {"user_info.$.status": 1}
$elemMath只匹配第一條數(shù)據(jù),當(dāng)數(shù)組里存在多條一樣的數(shù)據(jù)時(shí),只返回第一條數(shù)據(jù)
let arr = [ { is_delete: 1, name: "a" }, { is_delete: 1, name: "b" } ] {$elemMatch: {is_delete: 1}}只匹配arr的第一條數(shù)據(jù)
aggregate匹配多條數(shù)據(jù)
/* aggregate聚合操作,$unwind將數(shù)組拆分成單個(gè)元素 * $group 分組依據(jù) * $sum 統(tǒng)計(jì) * $project 將返回值進(jìn)行篩選,是否返回篩選完后的某個(gè)字段 * */ message.aggregate([ { $match: { "user_info.user_id": id, "user_info.is_delete": 0 } }, { $unwind: "$user_info" }, { $group: { _id: {status: "$user_info.status",}, count: {$sum: 1} } }, { $project: { "_id": 0, "status": "$_id.status", "count": 1 } } ]).then()
對于匹配數(shù)組里的某項(xiàng)中的某個(gè)字段
let arr = [ { is_delete: 1, name: "a" }, { is_delete: 1, name: "b" } ] /* 匹配arr中的name */ $match: { "arr.name": "a" } /* 分組篩選 */ $ group: { _id: {name: "$arr.name"} }
對對象中的數(shù)組進(jìn)行插入數(shù)據(jù)操作
let obj = { id: 1, arr: [ { is_delete: 1, name: "a" }, { is_delete: 1, name: "b" } ] } {"$push": {arr: {name: "c", is_delete: 0}}}
正在努力學(xué)習(xí)中,若對你的學(xué)習(xí)有幫助,留下你的印記唄(點(diǎn)個(gè)贊咯^_^)
往期好文推薦:
使用vue開發(fā)移動(dòng)端管理后臺(tái)
實(shí)現(xiàn)單行及多行文字超出后加省略號(hào)
node之本地服務(wù)器圖片上傳
純css實(shí)現(xiàn)瀑布流(multi-column多列及flex布局)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/19522.html
摘要:在做自己的一個(gè)小項(xiàng)目時(shí),新學(xué)習(xí)了非關(guān)系型數(shù)據(jù)庫,使用了封裝好的查詢方法,包括數(shù)據(jù)庫分頁用到的和方法,這里記錄下。 在做自己的一個(gè)小項(xiàng)目時(shí),新學(xué)習(xí)了mongodb非關(guān)系型數(shù)據(jù)庫,使用了mongoose封裝好的查詢方法,包括數(shù)據(jù)庫分頁用到的limit和skip方法,這里記錄下。 1. mongodb數(shù)據(jù)庫連接 參照官網(wǎng)文檔對應(yīng)的參數(shù)如下: mongodb://[username:passw...
摘要:前文上篇中篇地址現(xiàn)在只剩下把東西展示出來了頁面這里有四種頁面其實(shí)是四個(gè)組件文章,雜談,收藏,具體的文章或雜談前三個(gè)雖然布局一樣,但功能有細(xì)微差別,同時(shí)考慮到以后可能要針對不同種類做不同的布局方法我還是定義了三個(gè)組件以及具體的那個(gè)可以看到它們 前文 上篇:https://segmentfault.com/a/11...中篇:https://segmentfault.com/a/11......
摘要:前文上篇中篇地址現(xiàn)在只剩下把東西展示出來了頁面這里有四種頁面其實(shí)是四個(gè)組件文章,雜談,收藏,具體的文章或雜談前三個(gè)雖然布局一樣,但功能有細(xì)微差別,同時(shí)考慮到以后可能要針對不同種類做不同的布局方法我還是定義了三個(gè)組件以及具體的那個(gè)可以看到它們 前文 上篇:https://segmentfault.com/a/11...中篇:https://segmentfault.com/a/11......
摘要:前文上篇中篇地址現(xiàn)在只剩下把東西展示出來了頁面這里有四種頁面其實(shí)是四個(gè)組件文章,雜談,收藏,具體的文章或雜談前三個(gè)雖然布局一樣,但功能有細(xì)微差別,同時(shí)考慮到以后可能要針對不同種類做不同的布局方法我還是定義了三個(gè)組件以及具體的那個(gè)可以看到它們 前文 上篇:https://segmentfault.com/a/11...中篇:https://segmentfault.com/a/11......
摘要:前文上篇中篇地址現(xiàn)在只剩下把東西展示出來了頁面這里有四種頁面其實(shí)是四個(gè)組件文章,雜談,收藏,具體的文章或雜談前三個(gè)雖然布局一樣,但功能有細(xì)微差別,同時(shí)考慮到以后可能要針對不同種類做不同的布局方法我還是定義了三個(gè)組件以及具體的那個(gè)可以看到它們 前文 上篇:https://segmentfault.com/a/11...中篇:https://segmentfault.com/a/11......
閱讀 922·2021-10-13 09:48
閱讀 3907·2021-09-22 10:53
閱讀 3114·2021-08-30 09:41
閱讀 1943·2019-08-30 15:55
閱讀 2920·2019-08-30 15:55
閱讀 1839·2019-08-30 14:11
閱讀 2205·2019-08-29 13:44
閱讀 764·2019-08-26 12:23