MongoDb Count+distinct+Group

1.Count

    请查询persons中美国学生的人数.

方式1、

     db.persons.find({country:"USA"}).count()

方式2、

{
  count: <collection or view>,
  query: <document>,
  limit: <integer>,
  skip: <integer>,
  hint: <hint>,
  readConcern: <document>
}

group(key , reduce ,initial, [keyf] , [cond] , finalize) 
key : 一个指定要根据哪些键进行分组的对象,其属性为要用于分组的字段。 
cond : 可选参数。这是一个query对象,决定了初始结果集将包含哪些文档。 
initial : 一个包含初始字段和初始值的初始group对象,用于在分组期间聚合数据 
reduce : 一个接受参数obj和prev的函数(function(obj,prev)),对于每个与查询匹配的文档,都执行这个函数。其中参数obj为当前文档,而prev是根据参数initial创建的对象,这让您能够根据obj来更新prev 
finalize : 一个接受唯一参数的obj的函数(function(obj)),这个参数是对与每个键值组合匹配的最后一个文档执行reduce函数得到的。 
keyf : 可选参数,用于替代参数key,可以不指定其属性为分组字段的对象,而指定一个函数。可以使用函数动态地指定要根据哪些键进行分组。
db.runCommand({count:"persons"})
{ "n" : 11, "ok" : 1 }

select count("id") from persons;

带条件
db.runCommand({
    count:"persons", 
    query:{age:22}
})

 

2.Distinct

     

db.collection_name.distinct(field,query,options)

field -----指定要返回的字段(string)

query-----条件查询(document)

options-----其他的选项(document) // 我现在还不知道他的具体作用,后续知道了在更新

通过name去重
db.persons.distinct("name")
相当于sql语句
select distinct(name) from persons;


db.persons.distinct("name",{age:22})
相当于sql
select distinct(name) from persons where age = 22;
这种写法还不知到是什么,有什么作用
 db.persons.distinct("name",{},{collation:{locale:"fr", strength:2}})

当然,也可以使用runCommand, runCommand可以执行任意的mongo 命令;

{
  distinct: "<collection>",
  key: "<field>",
  query: <query>,
  readConcern: <read concern document>,
  collation: <collation document>
}
db.runCommand({distinct:"persons", key:"name"});

{
	"values" : [
		"jim",
		"tom",
		"lili",
		"zhangsan",
		"lisi",
		"wangwu",
		"zhaoliu",
		"piaoyingjun",
		"lizhenxian",
		"lixiaoli",
		"zhangsuying"
	],
	"ok" : 1
}
db.runCommand({
distinct:"persons", 
key:"name",
query:{age:22}})


结果
{ "values" : [ "zhangsuying" ], "ok" : 1 }

请查询出persons中一共有多少个国家分别是什么.

      db.runCommand({distinct:"persons“ , key:"country"}).values

3.Group

      语法:

db.collection.group({ key, reduce, initial [, keyf] [, cond] [, finalize] })
db.runCommand({
group:{
ns:集合名字,
Key:分组的键对象,
Initial:初始化累加器, 
$reduce:组分解器,
Condition:条件,
Finalize:组完成器
 }})

         3.1请查出persons中每个国家学生数学成绩最好的学生信息(必须在90以上)


db.runCommand({group:{
	ns:"persons",
	key:{"country":true},
	initial:{m:0},  //初始化累加器
	// 把当前文档,和prev 累加器, doc 当前文档,如果满足条件。就会替换当前累加器
	$reduce:function(doc,prev){
		if(doc.m > prev.m){
			prev.m = doc.m;
			prev.name = doc.name;
			prev.country = doc.country;
		}
	},
	condition:{m:{$gt:90}}
}})

返回结果:
{
	"retval" : [
		{
			"country" : "USA",
			"m" : 96,
			"name" : "jim"
		},
		{
			"country" : "China",
			"m" : 96,
			"name" : "lisi"
		}
	],
	"count" : NumberLong(3),
	"keys" : NumberLong(2),
	"ok" : 1
}
db.getCollection('persons').group({
    key:{"country":1},
    initial:{m:0},
    reduce: function (curr, result) {
        if(curr.m > result.m){
            result.m = curr.m;
            result.name = curr.name;
            result.country = curr.country;
            }
        },
    cond:{m:{$gt: 90}}
});

结果

[
	{
		"country" : "USA",
		"m" : 96,
		"name" : "jim"
	},
	{
		"country" : "China",
		"m" : 96,
		"name" : "lisi"
	}
]

相当于sql

SELECT country, name, max('m') as max_m
FROM persons
WHERE m > 90
GROUP BY country;



官网上是例子:
1、db.orders.group(
   {
     key: { ord_dt: 1, 'item.sku': 1 },
     cond: { ord_dt: { $gt: new Date( '01/01/2012' ) } },
     reduce: function ( curr, result ) { },
     initial: { }
   }
)

sql:
SELECT ord_dt, item_sku
FROM orders
WHERE ord_dt > '01/01/2012'
GROUP BY ord_dt, item_sku

2、db.orders.group(
   {
     key: { ord_dt: 1, 'item.sku': 1 },
     cond: { ord_dt: { $gt: new Date( '01/01/2012' ) } },
     reduce: function( curr, result ) {
                 result.total += curr.item.qty;
             },
     initial: { total : 0 }
   }
)
sql:
SELECT ord_dt, item_sku, SUM(item_qty) as total
FROM orders
WHERE ord_dt > '01/01/2012'
GROUP BY ord_dt, item_sku


3、对分组结果进行一些处理,finalize:function(){....};
db.getCollection('persons').group({
    key:{"country":1},
   initial:{m:0},
    reduce: function (curr, result) {
        if(curr.m > result.m){
            result.m = curr.m;
            result.name = curr.name;
            result.country = curr.country;
            }
        },
    cond:{m:{$gt: 90}},
    finalize:function(result){
       result.userInfo = "name:"+ result.name + "math.scores:"+ result.m
       result.userName = "name:"+result.name;
        }
      
});

现在有一个问题,那就是同一个字段出现大小写不同,

      

   

猜你喜欢

转载自blog.csdn.net/zhihuirensheng123/article/details/81484514