mogodb查询统计相关语法

版权声明:转发请注明,谢谢配合 https://blog.csdn.net/qq_31289187/article/details/84792468

       公司经常使用mogodb存储数据,避免不了使用mogodb的语法进行查询统计,开始的时候各种碰壁,慢慢学习并掌握了基础的查询语句,贡献这个文档,希望不要像我一样耽误开发效率,如果学习能力不强,有时候会影响自己在同事心中的形象,作为程序猿,我们一直需要学习,学习自己以前没有接触的东西,废话不多说了,我把百度云的地址贡献出来。

mogodb查询统计相关语法文档下载地址

下面贴出来的很乱,自己在百度云下载一份

mogoDB查询相关文档
一、文档结构
 
二、语法
1、	find()查询文档
语法格式:db.collection.find(query, projection)
query:查询条件,
projection:返回的文档包含哪些字段,如果省略改参数,则返回所有字段
例子:db.getCollection('user_test').find({'name':'lihao-0'},{'_id':0,'name':1})
查询条件:name='lihao-0',返回的参数不包括_id,只包含name
 
返回除_id其它所有字段
 

db.getCollection('user_test').find({})
返回所有文档
 
2、	findOne()只返回一个文档
 

3、	模糊查询、条件查询
db.getCollection('user_test').find({'age':{$gte:20},'name':/lihao/})

条件:age>=20 and name like ‘lihao’

查询以lihao开头的文档
db.getCollection('user_test').find({'name':/^lihao/})
查询以lihao结尾的文档
db.getCollection('user_test').find({'name':/lihao$/})

mogodb中的条件操作符:

大于 >: $gt
小于 <: $lt
大于等于 >= : $gte
小于等于 <= : $lte
等于 = : $eq
不等于 != : $ne

Mogodb中的$or和$and操作符:

db.getCollection('user_test').find({$or:[{'name':'lihao-10'},{'name':'lihao-0'}]})

$or用法:$or:[{‘key’:‘value’,’key’:’value1’}]

相当于mysql中的查询条件:where key = value or key = value1

db.getCollection('user_test').find({'name':'lihao-10','age':'10'})

$and用法:中间用逗号分开

相当于mysql中查询条件:where name = ‘lihao-10’and age = 10

db.getCollection('user_test').find({'name':'lihao-10',$or:[{'age':{$gte:0}},{'customerId':{$lte:20}}]})

$and 和 $or 联合使用,相当于mysql 中的查询条件:

Where name = ‘lihao-10’and (age >= 0 or customerId <= 20)

4、$type 操作符
作用:检索文档中的数据类型并返回符合条件的数据,共有19个类型
 

 

例如:db.getCollection('user_test').find({'age':{$type:16}})

找到文档中age是整数的文档



 

4、	limit()和skip()用法

返回文档中的第一条:
db.getCollection('user_test').find({}).limit(1)
 
返回文档中的第二条:跳过第一条,只返回第二条
db.getCollection('user_test').find({}).limit(1).skip(1)

 
Skip()方法默认是0,通过limit()和skip()可以实现分页查询
5、	sort()方法
sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。
db.getCollection('user_test').find({},{'age':1,'name':1,'_id':0}).sort({'age':-1})
这里只返回age和name两个字段,_id是文档中的默认字段,如果不指定,默认返回_id,然后通过age进行降序排列

db.getCollection('user_test').find({},{'age':1,'name':1,'_id':0}).limit(2).skip(2).sort({'age':-1})

limit()、skip()、sort(),执行顺序依次是:sort()->skip()->limit(),所以不管怎么调整查询语句中这个三个方法的顺序,执行顺序依次关系还是一样的,那么返回的数据都是一样的。

 

 

6、	createIndex() 方法
createIndex()创建索引,语法:db.collection.createIndex(key, options)

语法中 Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可。

 

db.getCollection('user_test').createIndex({'name':1})

 

MogoDB中创建的索引,可以创建唯一索引,指定文档的生存时间,指定索引名称,mogodb默认会给一个索引名称,mogodb创建索引默认会阻塞其它操作,也有这样的措施(background)来保证创建索引可以进行其它操作。

查看当前文档创建了那些索引:db.getCollection('user_test').getIndexes()
 
Mogodb中默认会给_id创建索引,

查看索引的大小:db.getCollection('user_test').totalIndexSize()

删除索引索引,慎用:db.getCollection('user_test').dropIndexes()

删除指定索引:db.getCollection('user_test').dropIndex(索引名称)

 

 

{
        "v" : 2,                              版本
        "key" : {
            "_id" : 1                         字段,可以是多个
        },
        "name" : "_id_",                      索引名
        "ns" : "collection_test.user_test"    文档名
}

7、	正则表达式
db.getCollection('user_test').find({'name':{$regex:"lihao"}})
查询文档中name中的字段包含lihao的文档集合,跟
db.getCollection('user_test').find({'name':‘/lihao/’ })
结果是一样的,但是$regex可以不区分大小写

 

 
$regex操作符中的option选项可以改变正则匹配的默认行为,它包括i, m, x以及S四个选项,其含义如下
i 忽略大小写,{<field>{$regex/pattern/i}},设置i选项后,模式中的字母会进行大小写不敏感匹配。
m 多行匹配模式,{<field>{$regex/pattern/,$options:'m'},m选项会更改^和$元字符的默认行为,分别使用与行的开头和结尾匹配,而不是与输入字符串的开头和结尾匹配。
x 忽略非转义的空白字符,{<field>:{$regex:/pattern/,$options:'m'},设置x选项后,正则表达式中的非转义的空白字符将被忽略,同时井号(#)被解释为注释的开头注,只能显式位于option选项中。
s 单行匹配模式{<field>:{$regex:/pattern/,$options:'s'},设置s选项后,会改变模式中的点号(.)元字符的默认行为,它会匹配所有字符,包括换行符(\n),只能显式位于option选项中。
使用$regex操作符时,需要注意下面几个问题:
i,m,x,s可以组合使用,例如:{name:{$regex:/j*k/,$options:"si"}}
在设置索弓}的字段上进行正则匹配可以提高查询速度,而且当正则表达式使用的是前缀表达式时,查询速度会进一步提高,例如:{name:{$regex: /^joe/}

8、	mogodb聚合函数
a、分组求和
db.getCollection('user_test').aggregate([{$group : {_id : "$name", totalAge : {$sum : "$age"}}}])

通过name分组求age的总和
相当于:select name,sum(age)as totalAge from user_test group by name;

b、不分区,只是求总和

db.getCollection('user_test').aggregate([{$group : {_id : "name", totalNum : {$sum : "$age"}}}])

_id:”$字段”,我们可以将这里的值写死

 

c、分组求平均值
db.getCollection('user_test').aggregate([{$group : {_id : "$name", totalNum : {$avg : "$age"}}}])

d、不分组求平均值
 

e、求最大值和最小值
db.getCollection('user_test').aggregate([{$group : {_id : "name", totalNum : {$max : "$age"}}}])

 

db.getCollection('user_test').aggregate([{$group : {_id : "name", totalNum : {$min : "$age"}}}])

 

9、	mogodb管道
管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档

聚合框架中常用的几个操作:
	$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
	$match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
	$limit:用来限制MongoDB聚合管道返回的文档数。
	$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
	$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
	$group:将集合中的文档分组,可用于统计结果。
	$sort:将输入文档排序后输出。
	$geoNear:输出接近某一地理位置的有序文档。

a、$project的用法

db.getCollection('user_test').aggregate(
  [
    {
        $project:
         {
             _id:0,
             name:1,
             age:1
         }
    }
  ]
);
 
最后返回的结果只包含name、age这两个字段,_id是文档的主键,默认是返回
的,0:表示不返回,1:表示返回

相当于mysql的语句:select name,age from user_test;
b、$project 重命名用法
db.getCollection('user_test').aggregate(
  [
    
    {
        $project:
         {
             _id:0,
             name:1,
             age:1,
             testAge:"$age"
         }
    }
    
  ]
);
相当于mysql的语句:select name,age,age as testAge from user_test;

c、$match、$sort、$limit用法
db.getCollection('user_test').aggregate(
  [
    {
       $match:
        {
          age :{$gte:20}   
        }
    }
    ,
    {
        $project:
         {
             _id:0,
             name:1,
             age:1
         }
    }
    ,
    {
        $sort:
        {
            age : -1
        }
    }
    ,
    {
        $limit: 4
    }
  ]
);
上面这个稍微复杂一点,主要是mogodb的语法恶心
相对于mysql中的查询语句:

select name,age from user_test where age >= 20 order by age desc limit 4;
这里面用到了$match,$sort,$limit,其中$match就是过滤,前面总结的条件查询在$match就可以用到了

 

D、$poject 中多列求和

db.getCollection('user_test').aggregate(
  [
    
    {
        $project:
         {
             _id:0,
             name:1,
             age:1,
             testAge:"$age",
             totalAge:{$add:["$age",12]}
         }
    }
    
  ]
);
 

猜你喜欢

转载自blog.csdn.net/qq_31289187/article/details/84792468