首页 > 数据库 >Mongodb(4)索引,查看执行计划,聚合操作aggregate,表关联查询,批量插入测试数据,执行计划分析详解

Mongodb(4)索引,查看执行计划,聚合操作aggregate,表关联查询,批量插入测试数据,执行计划分析详解

时间:2024-10-21 18:10:44浏览次数:1  
标签:Mongodb db 测试数据 var 索引 books aggregate Math

  1. 创建索引,支持:单键索引、复合索引,唯一索引

创建索引后台执行

db.books.createIndex({open: 1, close: 1}, {background: true})

对内嵌文档字段创建索引:

db.books.createIndex({"author.name":1})

创建唯一索引

db.books.createIndex({title:1},{unique:true})

在包含嵌套对象的数组字段上创建多键索引

db.books.createIndex( { "stock.size": 1, "stock.quantity": 1 } )

Hash索引(Hashed Indexes)

db.users.createIndex({username : 'hashed'})

地理空间索引(Geospatial Index)
创建通配符索引

查看执行计划

db.books.find({type:"novel",favCount:{$gt:50}}).explain()

查看索引

查看索引信息

db.books.getIndexes()

查看索引键

db.books.getIndexKeys()

删除索引

删除集合指定索引

db.col.dropIndex("索引名称")

删除集合所有索引 不能删除主键索引

db.col.dropIndexes()

18.聚合操作aggregate,聚合框架相当于 SQL 查询中的GROUP BY、 LEFT OUTER JOIN 、 AS等
常用的管道聚合阶段
阶段运算符 描述 SQL等价运算符
$match 筛选条件 WHERE
$project 投影 AS
$lookup 左外连接 LEFT OUTER JOIN
$sort 排序 ORDER BY
$group 分组 GROUP BY
$skip/$limit 分页
$unwind 展开数组
$graphLookup 图搜索
$facet/$bucket 分面搜索

18.1 $project:字段别名,0 不显示的字段,1显示的字段
db.getCollection("books").aggregate([{$project:{name2: "$title"}}])
db.getCollection("books").aggregate([{$project:{name3: "$title",_id:0,type:1,author.name:1}}])

18.2 $match 筛选
db.books.aggregate([
{$match:{type:"technology"}},
{$project:{name:"$title",_id:0,type:1,author:{name:1}}}
])

18.3 $count 计数并返回与查询匹配的结果数
db.books.aggregate([
{$match:{type:"technology"}},
{$count: "type_count"} 4 ])

18.4 $group对文档进行分组
db.books.aggregate([
{$group:{_id:null,count:{$sum:1},pop:{$sum:"$favCount"},avg:{$avg:"$favCount"}}}
])

db.books.aggregate([
{$group:{_id:"$author.name",pop:{$sum:"$favCount"}}}
])

db.zips.aggregate( [
{ $group: { _id: "$state", totalPop: { $sum: "$pop" } } },
{ $match: { totalPop: { $gt: 1010001000 } } }] )

18.5 $lookup 多表关联查询,相当于左外链接
2表关联查询:
db.getCollection("books").aggregate(
[{
$lookup: {
from: "customer",
localField: "title",
foreignField: "name",
as: "booksName"
} }
])

3表关联查询:
db.order.aggregate([
{$lookup: {
from: "customer",
localField: "customerCode",
foreignField: "customerCode",
as: "curstomer"
}
},
{$lookup: {
from: "orderItem",
localField: "orderId",
foreignField: "orderId",
as: "orderItem"
}
}
])

mongoimport -h 192.168.65.174 -d test -u fox -p fox --authenticationDatabase=admin -c zips --file D:\zips.json

  1. 批量插入测试数据
    var tags = ["nosql","mongodb","document","developer","popular"];
    var types = ["technology","sociality","travel","novel","literature"];
    var books=[];
    for(var i=0;i<50;i++){
    var typeIdx = Math.floor(Math.random()types.length);
    var tagIdx = Math.floor(Math.random()
    tags.length);
    var tagIdx2 = Math.floor(Math.random()tags.length);
    var favCount = Math.floor(Math.random()
    100);
    var username = "xx00"+Math.floor(Math.random()10);
    var age = 20 + Math.floor(Math.random()
    15);
    var book = {
    title: "book-"+i,
    type: types[typeIdx],
    tag: [tags[tagIdx],tags[tagIdx2]],
    favCount: favCount,
    author: {name:username,age:age}
    };
    books.push(book)
    }
    db.books.insertMany(books);

db.getCollection("books").find({Asin:{$in:[
"B07SC9RTQ8",
"B07SC9RTQ9"
]}}).sort({"Asin":1})

db.getCollection("book").find()
db.getCollection("book").getIndexes()
db.getCollection("book").createIndex({"sku":1})
db.getCollection("book").createIndex({"categoryId":-1})

db.createCollection("book");

db.getCollection("book").insertOne({
uniqueId: "705f6c3aec584c47936b40502fbcafab",
siteCode: "US",
entityName: "Wall Washer Light",
categoryId: "228013,495224,495236,553784,14193181",
categoryName: "Tools & Home Improvement,Lighting & Ceiling Fans,Outdoor Lighting,Landscape Lighting,Spotlights",
status: NumberInt("1"),
addTime: ISODate("2024-10-18T17:32:18.254Z"),
updateTime: ISODate("2024-10-18T17:32:18.254Z"),
});

20.MongoDB执行计划分析详解

db.books.find({_id:"671609d23146000034003cf1"}).explain("queryPlanner")
db.books.find({_id:"671609d23146000034003cf1"}).explain()

queryPlanner 执行计划的详细信息,包括查询计划、集合信息、查询条件、最佳执行计划、查询方式和MongoDB 服务信息等
exectionStats 最佳执行计划的执行情况和被拒绝的计划等信息
allPlansExecution 选择并执行最佳执行计划,并返回最佳执行计划和其他执行计划的执行情况

winningPlan.stage状态分析
是stage的类型。类型列举如下:
COLLSCAN 全表扫描
IXSCAN 索引扫描
FETCH 根据索引检索指定文档
SHARD_MERGE 将各个分片返回数据进行合并
SORT 在内存中进行了排序
LIMIT 使用limit限制返回数
执行计划的返回结果中尽量不要出现以下stage:
SKIP 使用skip进行跳过
IDHACK 对_id进行查询
SHARDING_FILTER 通过mongos对分片数据进行查询
COUNTSCAN count不使用Index进行count时的stage返回
COUNT_SCAN count使用了Index进行count时的stage返回
SUBPLA 未使用到索引的$or查询的stage返回
TEXT 使用全文索引进行查询时候的stage返回
PROJECTION 限定返回字段时候stage的返回

执行计划的返回结果中尽量不要出现以下stage:
COLLSCAN(全表扫描)
SORT(使用sort但是无index)
不合理的SKIP
SUBPLA(未用到index的$or)
COUNTSCAN(不使用index进行count)

标签:Mongodb,db,测试数据,var,索引,books,aggregate,Math
From: https://www.cnblogs.com/chenshaojun2008/p/18489993

相关文章

  • MongoDB 集群部署
    MongoDB集群部署环境系统:CentOS7主机端口角色192.168.93.10027017master192.168.93.10127017slave192.168.93.10227017arditer镜像拉取dockerpullmongo:4.4挂载目录#配置文件地址mkdir-p/data/mongodb/configdb#db存放地址mkdir-p......
  • mongodb 查询条件,查询逻辑对照表,逻辑运算符,正则表达式匹配查询,排序,分页/巧分页,更新操
    mongodb查询条件,查询逻辑对照表,逻辑运算符,正则表达式匹配查询,排序,分页/巧分页,更新操作符,更新单个/多个文档,删除文档,批量插入,$type操作符,内嵌文档和数组查找修改1.条件查询SQLMQLa=1{a:1}a<>1{a:{$ne:1}}a>1{a:{$gt:1}}a>=1{a:{$gte:1}}a<1{a:{$lt......
  • Java 代码里如何设置,可以让程序仅仅从 MongoDB 的主节点读写,而不从从节点读写
    在Java中,如果你希望仅从MongoDB的主节点(primarynode)进行读写操作,而避免从从节点(secondarynodes)读写,可以通过以下方式配置MongoDB客户端:1.使用ReadPreference.primary()配置MongoDB提供了ReadPreference类来定义客户端的读偏好。默认情况下,ReadPreference.primary(......
  • 关于Jmeter聚合报告Aggregate Report的认识偏差
    目光凝视远方的同时,也请夯实脚下土地。一般我们说起接口的性能指标如何,都离不开rt,但是你真的清楚jmeter相关报告里面关于rt的解释?往往一个小小的指标解读偏差,会带来一场风暴。AggregateReport(聚合报告)这份聚合报告,相信很多同学都不陌生,单纯看这个结果,相信不同的人......
  • mongodb 常用查询API
    mongodb常用查询API:db.book.find(0.count()db.book.find({},{bookid,name,status})//selectbookid,name,statusfrombookdb.book.find({age:{$gt:30}})db.book.find({age:{$gte:30}})db.book.find({age:{$lt:30}})db.book.find({age:{$gt:30,$lt:50}})db.book.find({$......
  • Mongodb 性能监控工具FreeMonitoring,mongostat,mongotop,Profiler,索引,分片,事务超时,Mongo
    db.users.createIndex({username:'hashed'})1#创建唯一索引db.values.createIndex({title:1},{unique:true})2#复合索引支持唯一性约束db.values.createIndex({title:1,type:1},{unique:true})3#多键索引支持唯一性约束db.inventory.createIndex({ratings:1},{uni......
  • MongoDB安装(新版本保姆级教程)
    下载安装包首先进入官网(社区版),在对应页面选择需要安装的版本(这里下载当前适合版本号)DownloadMongoDBCommunityServer|MongoDB 选择在任一磁盘创建空文件夹(不要使用中文路径),解压之后把文件夹内容剪切进去手动创建data和log两个文件夹找到path,打开路径,将自......
  • 第三节:MongoDB聚合操作和索引详解
    一.        二.        三.         !作       者:Yaopengfei(姚鹏飞)博客地址:http://www.cnblogs.com/yaopengfei/声     明1:如有错误,欢迎讨论,请勿谩骂^_^。声     明2:原创博客请在转载......
  • MongoDB
    MongoDB快速上手文章目录MongoDB快速上手前言一、环境搭建二、MongoDB操作1.数据库操作1.1选择和创建数据库1.2数据库的删除2.集合操作2.1集合的显式创建(了解)2.2集合的隐式创建2.3集合的删除3.文档基本CRUD3.1文档的插入(1)单个文档插入(2)批量插入3.2文档的基本......
  • MongoDB安装及配置Navicat MongoDB Tools
    一、下载MongoDB1.下载网址:https://www.mongodb.com/try/download/community注:本文档以Windows和msi安装为例二、安装MongoDB打开.msi文件在硬盘任意位置创建mongo目录,内包含mongo.conf文件内容:#存放数据目录dbpath=D:\mongo\data\db端口port=27017日志......