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;
}
});
现在有一个问题,那就是同一个字段出现大小写不同,