Qt5.9.7交叉編譯gstreamer
下載安裝MongoDB
將MongoDB伺服器作為Windows服務執行
mongod --dbpath "D:\Program Files\mongodb\data\db" --logpath "D:\Program Files\mongodb\log\mongodb.log" --serviceName "mongodb" --serviceDisplayName "mongodb" --install
得到如下輸出
2018-03-10T23:32:46.339+0800 I CONTROL log file "D:\data\log\mongodb.log" exists; moved to "D:\data\log\mongodb.log.2018-03-10T15-32-46".
說明Mongodb服務安裝成功。啟動mongodb服務:
D:\mongodb\bin>net start mongodb
MongoDB 服務已經啟動成功。
開啟瀏覽器,範圍地址http://127.0.0.1:27017/, 埠沒改預設為27017,可看到如下資訊
It looks like you are trying to access MongoDB over HTTP on the native driver port.
MongoDB聚合查詢
聚合查詢摘要,聚合框架是MongoDB的高階查詢語言,允許我們通過轉化合並由多個文件的資料來生成新的在單個文件裡不存在的文件資訊。通俗一點來說,可以把MongoDB的聚合查詢等價於SQL的GROUP BY語句。
每個聚合操作完後,將輸出資料作為下一個聚合操作的輸入資料。
1.$project
- 修改輸入文件的結構
- 重新命名、增加或刪除域
- 建立計算結果以及巢狀文件
例:獲取test集合的weight欄位及name欄位(_id不顯示)
db.test.aggregate(
{ $project : {
_id: 0 ,
weight: 1 ,
name : 1
}}
);
2.$match
- 用於過濾資料,只輸出符合條件的文件,傳遞到下一個管道階段。
- 在$match中不能使用$geoNear地理空間操作符及$where表示式操作符
例:獲取test集合的weight>=0.5且weight<=1
db.test.aggregate( {
$match :
{ weight :
{ $gte : 0.5, $lte : 1 }
}
});
3.$group
- 將集合中的文件分組,可用於統計結果
- 在$match中不能使用$geoNear地理空間操作符及$where表示式操作符
例:獲取test集合的weight>=0.5且weight<=1,然後將符合條件的記錄送到下一階段$group管道操作符進行處理
db.test.aggregate([
{$match :
{ weight :
{ $gte : 0.5, $lte : 1 }
}
},
{ $group:
{ _id: null,
count: { $sum: 1 }
}
}
]);
4.$limit
- $limit會接受一個數字n,返回結果集中的前n個文件
- 限制傳遞到管道中下一階段的文件數
- 此操作僅返回管道傳遞給它的前5個文件, $limit對其傳遞的文件內容沒有影響。
db.test.aggregate({ $limit : 5 });
5.$skip
- $skip接受一個數字n,丟棄結果集中的前n個文件
- 跳過進入stage的指定數量n的文件,並將其餘文件傳遞到管道中的下一個階段
例:獲取test集合中第5條資料之後的資料
db.test.aggregate({ $skip: 5 });
6.$count
- 返回包含輸入到stage的文件的計數,理解為返回與表或檢視的find()查詢匹配的文件的計數。
例:獲取當前查詢完得到的數量
{ $count: <string> }
7.$sort
- 對所有輸入文件進行排序,並按排序順序將它們返回到管道。
例:要對欄位進行排序,將排序順序設定為1或-1,以分別指定升序或降序排序
db.users.aggregate(
[
{ $sort : { shippingDate : -1} }
]
)
邏輯操作符
$gt 大於
$gte 大於等於
$lt 小於
$lte 小於等於
$ne 不等於
$and 要求滿足所有查詢條件 ,否則返回空
$or 或關係
$nor 或關係取反
$exists 通常是用於判斷是否有這個鍵,而不是SQL中的某個列上存在某個值
$type 針對欄位型別進行查詢
$in 在多個值範圍內
$nin 不在多個值範圍內
$all 匹配陣列中多個值
$regex 正則,用於模糊查詢
$size 匹配陣列大小
$maxDistance 範圍查詢,距離(基於LBS)
$mod 取模運算
$near 鄰域查詢,查詢附近的位置(基於LBS)
$elemMatch 匹配內陣列內的元素
$within 範圍查詢(基於LBS)
$box 範圍查詢,矩形範圍(基於LBS)
$center 範圍醒詢,圓形範圍(基於LBS)
$centerSphere 範圍查詢,球形範圍(基於LBS)
$slice 查詢欄位集合中的元素(比如從第幾個之後,第N到第M個元素)
Explain 分析查詢效能
COLLSCAN:全表掃描
IXSCAN:索引掃描
FETCH:根據索引去檢索指定document
SHARD_MERGE:將各個分片返回資料進行merge
SORT:表明在記憶體中進行了排序
LIMIT:使用limit限制返回數
SKIP:使用skip進行跳過
IDHACK:針對_id進行查詢
優化方法
- $match條件需要增加索引,如果是多個,最好用組合索引;
- $sort的欄位也需要增加索引;
- $group的_id也需要增加索引;
- limit可以大幅度降低時耗。
MongoDB 索引限制
額外開銷
每個索引佔據一定的儲存空間,在進行插入,更新和刪除操作時也需要對索引進行操作。所以,如果你很少對集合進行讀取操作,建議不使用索引。
記憶體(RAM)使用
由於索引是儲存在記憶體(RAM)中,你應該確保該索引的大小不超過記憶體的限制。
如果索引的大小大於記憶體的限制,MongoDB會刪除一些索引,這將導致效能下降。
查詢限制
索引不能被以下的查詢使用:
正則表示式及非操作符,如 $nin, $not, 等。
算術運算子,如 $mod, 等。
$where 子句
所以,檢測你的語句是否使用索引是一個好的習慣,可以用explain來檢視。
索引鍵限制
從2.6版本開始,如果現有的索引欄位的值超過索引鍵的限制,MongoDB中不會建立索引。
插入文件超過索引鍵限制
如果文件的索引欄位值超過了索引鍵的限制,MongoDB不會將任何文件轉換成索引的集合。與mongorestore和mongoimport工具類似。
最大範圍
- 集合中索引不能超過64個
- 索引名的長度不能超過128個字元
- 一個複合索引最多可以有31個欄位
慢查詢優化:
- 檢視某聚合查詢的執行計劃:
db.ODS_fi_task.explain("executionStats").aggregate([
{
"$match": {
"reply4Shipment": {
"$exists": true
}
}
},
{
"$sort": {
"etlLatestTime": -1
}
},
{
"$limit": 20
}
])
如下所示,可以看出,排序sort耗時很長,executionTimeMillis有5s不止,stage為COLLSCAN模式,效率低下;
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 2258,
"executionTimeMillis" : 5257,
"totalKeysExamined" : 0,
"totalDocsExamined" : 4758,
"executionStages" : {
"stage" : "COLLSCAN",
"filter" : {
"reply4Shipment" : {
"$exists" : true
}
},
"nReturned" : 2258,
"executionTimeMillisEstimate" : 41,
"works" : 4760,
"advanced" : 2258,
"needTime" : 2501,
"needYield" : 0,
"saveState" : 886,
"restoreState" : 886,
"isEOF" : 1,
"direction" : "forward",
"docsExamined" : 4758
}
}
}
},
新增etlLatestTime為索引
db.ODS_fi_task.createIndex({"etlLatestTime":-1})
速度提示顯著:
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 20,
"executionTimeMillis" : 70,
"totalKeysExamined" : 30,
"totalDocsExamined" : 30,
"executionStages" : {
"stage" : "FETCH",
"filter" : {
"reply4Shipment" : {
"$exists" : true
}
},
"nReturned" : 20,
"executionTimeMillisEstimate" : 0,
"works" : 30,
"advanced" : 20,
"needTime" : 10,
"needYield" : 0,
"saveState" : 8,
"restoreState" : 8,
"isEOF" : 0,
"docsExamined" : 30,
"alreadyHasObj" : 0,
"inputStage" : {
"stage" : "IXSCAN",
"nReturned" : 30,
"executionTimeMillisEstimate" : 0,
"works" : 30,
"advanced" : 30,
"needTime" : 0,
"needYield" : 0,
"saveState" : 8,
"restoreState" : 8,
"isEOF" : 0,
"keyPattern" : {
"etlLatestTime" : -1
},
"indexName" : "etlLatestTime_-1",
"isMultiKey" : false,
"multiKeyPaths" : {
"etlLatestTime" : [ ]
}