摘要:在做自己的一個小項目時,新學習了非關系型數據庫,使用了封裝好的查詢方法,包括數據庫分頁用到的和方法,這里記錄下。
</>復制代碼
在做自己的一個小項目時,新學習了mongodb非關系型數據庫,使用了mongoose封裝好的查詢方法,包括數據庫分頁用到的limit和skip方法,這里記錄下。
1. mongodb數據庫連接
參照官網文檔對應的參數如下:
</>復制代碼
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
使用mongoose進行數據庫的連接
</>復制代碼
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 });
若出現警告信息:要求使用新的編譯方式,則在連接的時候加上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 });
在連接數據庫時,對連接操作進行監聽處理
</>復制代碼
mongoose.connection.on("connected", function() {
console.log("Mongoose connection open to " + dataBaseUrl);
});
/* 連接數據庫異常 */
mongoose.connection.on("error", function(err) {
console.log("Mongoose connection error:" + err);
});
/* 連接數據庫斷開 */
mongoose.connection.on("disconnected", function() {
console.log("Mongoose connection disconnected");
});
2. 數據類型(mongoose中提供的schemaTypes)
數據類型有:String,Number,Date,Buffer,Boolean,ObjectId,Array,Mixed,Map,Decimal128
在數據庫直接用insert方法進行數據插入時,若不強制指定數字的類型,則默認是插入double型數字
3. mongoose對數據庫操作的方法 3.1 數據的插入先要新建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對進行數據的插入時,若直接插入,則會在新的集合中多出一個_v字段,這個代表的是集合的版本號,可以在schema中加入versionKey: false來刪除_v字段
數據插入:使用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 數據的查詢
使用find方法
</>復制代碼
record.find((err, docs) => {
if (err) {
res.send({ "status": -1, "msg": "參數錯誤" });
} else {
res.send({ "status": 200, "msg": "查詢成功", "result": docs});
}
});
3.3 數據的更新
更新一條數據:updateOne
</>復制代碼
/* 第一個參數為查詢參數,第二個為要更新的內容,第三個為回調方法 */
record.updateOne({_id: id}, updateInfo, (err, doc) => {
if(err) {
res.send({"status": -1, "msg": "更新失敗", "result": ""});
} else {
res.send({"status": 200, "msg": "更新成功", "result": ""});
}
})
更新多條數據: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": "參數錯誤"});
} else {
res.send({"status": 200, "msg": "清空成功"});
}
})
3.4 數據的刪除
</>復制代碼
/* 第一個為要刪除的內容的參數 */
record.findOneAndDelete({_id: req.body.id}, (err, doc) => {
if(err) {
res.send({"status": -1, "msg": "刪除失敗"});
} else {
res.send({"status": 200, "msg": "刪除成功"});
}
})
4. 數據庫的分頁操作(limit和skip方法)
limit()方法為限制數據庫每次查詢的數據條數;skip(param)跳過param條數據不查詢
</>復制代碼
/* page: 頁碼;pagesize: 每頁的數量 */
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.匹配數據
匹配數據中的數組里的某個對象里的某個字段,使用$set來設置對應的值
</>復制代碼
$set: {"user_info.$.status": 1}
$elemMath只匹配第一條數據,當數組里存在多條一樣的數據時,只返回第一條數據
</>復制代碼
let arr = [
{
is_delete: 1,
name: "a"
},
{
is_delete: 1,
name: "b"
}
]
{$elemMatch: {is_delete: 1}}只匹配arr的第一條數據
aggregate匹配多條數據
</>復制代碼
/* aggregate聚合操作,$unwind將數組拆分成單個元素
* $group 分組依據
* $sum 統計
* $project 將返回值進行篩選,是否返回篩選完后的某個字段
* */
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()
對于匹配數組里的某項中的某個字段
</>復制代碼
let arr = [
{
is_delete: 1,
name: "a"
},
{
is_delete: 1,
name: "b"
}
]
/* 匹配arr中的name */
$match: {
"arr.name": "a"
}
/* 分組篩選 */
$ group: {
_id: {name: "$arr.name"}
}
對對象中的數組進行插入數據操作
</>復制代碼
let obj = {
id: 1,
arr: [
{
is_delete: 1,
name: "a"
},
{
is_delete: 1,
name: "b"
}
]
}
{"$push": {arr: {name: "c", is_delete: 0}}}
</>復制代碼
正在努力學習中,若對你的學習有幫助,留下你的印記唄(點個贊咯^_^)
往期好文推薦:
使用vue開發移動端管理后臺
實現單行及多行文字超出后加省略號
node之本地服務器圖片上傳
純css實現瀑布流(multi-column多列及flex布局)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/19522.html
摘要:在做自己的一個小項目時,新學習了非關系型數據庫,使用了封裝好的查詢方法,包括數據庫分頁用到的和方法,這里記錄下。 在做自己的一個小項目時,新學習了mongodb非關系型數據庫,使用了mongoose封裝好的查詢方法,包括數據庫分頁用到的limit和skip方法,這里記錄下。 1. mongodb數據庫連接 參照官網文檔對應的參數如下: mongodb://[username:passw...
摘要:前文上篇中篇地址現在只剩下把東西展示出來了頁面這里有四種頁面其實是四個組件文章,雜談,收藏,具體的文章或雜談前三個雖然布局一樣,但功能有細微差別,同時考慮到以后可能要針對不同種類做不同的布局方法我還是定義了三個組件以及具體的那個可以看到它們 前文 上篇:https://segmentfault.com/a/11...中篇:https://segmentfault.com/a/11......
摘要:前文上篇中篇地址現在只剩下把東西展示出來了頁面這里有四種頁面其實是四個組件文章,雜談,收藏,具體的文章或雜談前三個雖然布局一樣,但功能有細微差別,同時考慮到以后可能要針對不同種類做不同的布局方法我還是定義了三個組件以及具體的那個可以看到它們 前文 上篇:https://segmentfault.com/a/11...中篇:https://segmentfault.com/a/11......
摘要:前文上篇中篇地址現在只剩下把東西展示出來了頁面這里有四種頁面其實是四個組件文章,雜談,收藏,具體的文章或雜談前三個雖然布局一樣,但功能有細微差別,同時考慮到以后可能要針對不同種類做不同的布局方法我還是定義了三個組件以及具體的那個可以看到它們 前文 上篇:https://segmentfault.com/a/11...中篇:https://segmentfault.com/a/11......
摘要:前文上篇中篇地址現在只剩下把東西展示出來了頁面這里有四種頁面其實是四個組件文章,雜談,收藏,具體的文章或雜談前三個雖然布局一樣,但功能有細微差別,同時考慮到以后可能要針對不同種類做不同的布局方法我還是定義了三個組件以及具體的那個可以看到它們 前文 上篇:https://segmentfault.com/a/11...中篇:https://segmentfault.com/a/11......
閱讀 937·2021-10-13 09:48
閱讀 3934·2021-09-22 10:53
閱讀 3127·2021-08-30 09:41
閱讀 1955·2019-08-30 15:55
閱讀 2934·2019-08-30 15:55
閱讀 1851·2019-08-30 14:11
閱讀 2215·2019-08-29 13:44
閱讀 777·2019-08-26 12:23