索引
创建索引
#说明:1表示升序创建索引,-1表示降序创建索引
>db.user.createIndex({'age':1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
删除索引
#删除索引
db.user.dropIndex("age_1")
#或者,删除除了_id之外的索引
db.user.dropIndexes()
查看执行计划
> db.user.find({age:{$gt:100},id:{$lt:200}}).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "testdb.user",
"indexFilterSet" : false,
"parsedQuery" : {
"$and" : [
{
"id" : {
"$lt" : 200
}
},
{
"age" : {
"$gt" : 100
}
}
]
},
"queryHash" : "5DD09CA4",
"planCacheKey" : "0167A000",
"winningPlan" : {
#查询方式,常见的有COLLSCAN/全表扫描、IXSCAN/索引扫描、 FETCH/根据索引去检索文档、SHARD_MERGE/合并分片结果、IDHACK/针对_id进行查询
"stage" : "FETCH",
"filter" : {
"id" : {
"$lt" : 200
}
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"age" : 1
},
"indexName" : "age_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"age" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"age" : [
"(100.0, inf.0]"
]
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "ad8b3bc4d6e9",
"port" : 27017,
"version" : "4.4.1",
"gitVersion" : "ad91a93a5a31e175f5cbf8c69561e788bbc55ce1"
},
"ok" : 1
}
查询
普通查询
####查询+排序,
字符串以外的字段查询需要指定类型
db.ad_user_idea.find({appVersion:Number(5),type:Number(100012)}).sort({created:1})
聚合查询
根据某一字段分组并统计总数
_id:'$topicOid',topicOid:{$sum:1}
写法为=>_id:'以哪个字段进行分组',分组数据的字段名:{$sum:1}'
db.ad_topic_like.aggregate([{$group:{_id:"$topicOid",topicOid:{$sum:1}}}])
$sum 计算总和。 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
$avg 计算平均值 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
$min 获取集合中所有文档对应值得最小值。 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
$max 获取集合中所有文档对应值得最大值。 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
$push 将值加入一个数组中,不会判断是否有重复的值。 db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
$addToSet 将值加入一个数组中,会判断是否有重复的值,若相同的值在数组中已经存在了,则不加入。 db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
$first 根据资源文档的排序获取第一个文档数据。 db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])
$last 根据资源文档的排序获取最后一个文档数据 db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])
管道查询
顾名思义就像管道一样,aggregate里配置的是一个[]数组,代表着一个个的管道,每一个管道处理的是上一个管道传给他的数据,需要注意字段的变更
$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
$match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
$limit:用来限制MongoDB聚合管道返回的文档数。
$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
$group:将集合中的文档分组,可用于统计结果。
$sort:将输入文档排序后输出。
$geoNear:输出接近某一地理位置的有序文档。
关联查询
db.ad_topic_like.aggregate([
{$group:{_id:'$topicOid',likeCount:{$sum:1}}},
{$sort:{'likeCount':-1}},
{$lookup:
{
from:'ad_user_idea', // 需要加入的表
localField:'_id', // 主表的关联键字段
foreignField:'_id', // 加入表的关联键字段
as:'idea' // 给关联表的别名
}
},
{$match:{'idea.appVersion':Number(5)}},// 筛选,注意这里如果表示表明要加'',保险起见以后所有的表明都加
{$skip:0},
{$limit:10}
])
模糊查询
如果开头包含空格(参数中的+将会变成空格)就匹配证明开头是明确的,因为手机号以+开头已为完整所以匹配正则^.phone****
否则就是没有输入+号码不完整匹配正则^.*phone*
Pattern pattern=
phone.charAt(0)==' '?
Pattern.compile("^." + phone + ".*$", Pattern.CASE_INSENSITIVE):
Pattern.compile("^.*" + phone + ".*$", Pattern.CASE_INSENSITIVE);
query.addCriteria(Criteria.where("Phone").regex(pattern));