zoukankan      html  css  js  c++  java
  • MongoDB 笔记之 聚合

    返回集合中的文档数量

    db.user.count()

    同样,还可以为 count 添加查询条件

    如:

    db.user.count({"name":"jack"});

    返回指定键所有不同的值

    db.runCommand({"distinct": "user","key":"name"})

    user 是集合, name 是键,功能同 关系型数据库的 distinct 一样,不多说

    group分组                       

    先举个例子吧,

    所有的数据:

    { "_id" : ObjectId("50c021d93a76cbcc77ae7411"), "name" : "tom", "sex" : "Male", "score" : "60" }
    { "_id" : ObjectId("50c0222b3a76cbcc77ae7412"), "name" : "jack", "sex" : "Male", "score" : "100" }
    { "_id" : ObjectId("50c022603a76cbcc77ae7413"), "name" : "lucy", "sex" : "Female", "score" : "90" }
    { "_id" : ObjectId("50c022843a76cbcc77ae7414"), "name" : "mark", "sex" : "Male", "score" : "84" }
    { "_id" : ObjectId("50c022a23a76cbcc77ae7415"), "name" : "mari", "sex" : "Female", "score" : "76" }

    假设:根据性别分组,并且找出男女中分数最高的人,并且排除 "jack" ,因为老师认定他考试作弊,被开除了。

    第一种做法:

    db.user.group(
    ..  {key:{sex:true},
    ..  initial:{score:0},
    ..  $reduce:function(doc,prev){
    ..  if(Number(doc.score)>Number(prev.score)){
    ..  prev.score = doc.score;
    ..  prev.name = doc.name
    ..  }},
    ..  condition:{name:{$ne:"John"}}
    .. })

    第二种做法:

     db.runCommand({group:
    .. {ns:"user",
    .. key:{sex:true},
    .. initial:{score:0},
    .. $reduce:function(doc,prev){
    .. if(Number(doc.score)>Number(prev.score)){
    .. prev.score = doc.score
    .. prev.name = doc.name
    .. }},
    .. condition:{name:{$ne:"John"}}
    .. }});

    ns:就是集合名称,nameSpace       

    key:分组的字段      

    initial:每个分组都会有一个 initial 初始文档,他作为传递每个分组最后的值,每一组的所有成员都会使用这个累加器,所以改变会保留。

    $reduce:每个文档都会调用一次这个函数,该函数传递两个参数,第一个参数为当前文档对象,第二个为累加器对象,也就是上面说的那个,我们这里是每次比较分数的值,哪个分数高,就把哪个放到累加器中,可以说,累加器对象里面有什么数据,最后的结果就是什么数据,再加上分组的数据。 在比较的时候我们使用了Number() js 函数,是为了让他做数学大小的比较

    condition:就是分组之前的筛选条件了。

    group 使用完成器,

    顾名思义,就是group 分组完成后调用的,相当于 关系型数据库的 having ,使用时只需将 finalize 键放进去,根据需求做处理就可以了






  • 相关阅读:
    [bzoj4241] 历史研究 (分块)
    [tyvj2054] 四叶草魔杖 (最小生成树 状压dp)
    20180710 考试记录
    [luogu2047 NOI2007] 社交网络 (floyed最短路)
    [luogu2081 NOI2012] 迷失游乐园 (树形期望dp 基环树)
    [luogu1600 noip2016] 天天爱跑步 (树上差分)
    [luogu2216 HAOI2007] 理想的正方形 (2dST表 or 单调队列)
    [poj 3539] Elevator (同余类bfs)
    [BZOJ1999] 树网的核 [数据加强版] (树的直径)
    bzoj2301 [HAOI2011]Problem b
  • 原文地址:https://www.cnblogs.com/moonciki/p/8145868.html
Copyright © 2011-2022 走看看