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 键放进去,根据需求做处理就可以了






  • 相关阅读:
    Object-C,NSSet,不可变集合
    NYIST 860 又见01背包
    NYIST 1070 诡异的电梯【Ⅰ】
    HDU 1542 Atlantis
    HDU 4756 Install Air Conditioning
    CodeForces 362E Petya and Pipes
    HDU 4751 Divide Groups
    HDU 3081 Marriage Match II
    UVA 11404 Palindromic Subsequence
    UVALIVE 4256 Salesmen
  • 原文地址:https://www.cnblogs.com/moonciki/p/8145868.html
Copyright © 2011-2022 走看看