资料运算


  • 註冊用戶

    1. 前言

    • 在前面的章节已经介绍过关于 MongoDB 基本的查询功能,本章将针对常用的聚合函数(count、distinct、group)做一些简单介绍。

    2. count

    • count 相信大家一定不会陌生,它在 MongoDB 里面的作用与其他关系型数据库一模一样。在关系型数据库中它是用来返回表中的记录条数,而在 MongoDB 中它用来返回集合中的文档数量。
    //我们先向集合 person 插入一个文档
    > db.person.insert({"name":"jason","age":30})
    WriteResult({ "nInserted" : 1 })
    //使用 count 返回 person 中文档数量
    > db.person.count()
    1
    //我们再向集合 person 插入一个文档
    > db.person.insert({"name":"lorraine","age":25})
    WriteResult({ "nInserted" : 1 })
    //此时使用 count 将返回2
    > db.person.count()
    2
    //也可以传入条件查询
    > db.person.count({"name":"lorraine"})
    1
    

    3. distinct

    • MongoDB 中 distinct 用来找出给定键的所有不同的值,使用时必须指定集合和键。此函数与关系型数据库的作用基本上也是一样。
    //我们可以再插入两笔name重复age不同的记录
    > db.person.insert({"name":"lorraine","age":22})
    WriteResult({ "nInserted" : 1 })
    > db.person.insert({"name":"jason","age":28})
    WriteResult({ "nInserted" : 1 })
    //查询一下集合现在已经有4个文档
    > db.person.find()
    { "_id" : ObjectId("5821757bf28fbb3e3516eeaa"), "name" : "jason", "age" : 30 }
    { "_id" : ObjectId("5821776ff28fbb3e3516eeab"), "name" : "lorraine", "age" : 25}
    { "_id" : ObjectId("5821829ef28fbb3e3516eeac"), "name" : "lorraine", "age" : 22}
    { "_id" : ObjectId("582182b0f28fbb3e3516eead"), "name" : "jason", "age" : 28 }
    //使用distinct返回name不同的值此语法类似于SQL:select distinct name from person
    > db.person.distinct('name')
    [ "jason", "lorraine" ]
    //由于age 没有重复记录将返回 4 条记录
    > db.person.distinct('age')
    [ 30, 25, 22, 28 ]
    

    4. group

    • group做的聚合有些复杂。先选定分组所依据的键,此后MongoDB就会将集合依据选定键值的不同分成若干组。然后可以通过聚合每一组内的文档,产生一个结果文档。
    • group需要以下几个参数:
      key:用来分组文档的字段。和keyf两者必须有一个
      keyf:可以接受一个javascript函数。用来动态的确定分组文档的字段。和key两者必须有一个
      initial:reduce中使用变量的初始化
      reduce:执行的reduce函数。函数需要返回值。
      cond:执行过滤的条件。
      finallize:在reduce执行完成,结果集返回之前对结果集最终执行的函数。可选的
    //我们使用 group 对 name 分组并计算出 age 的最大值
    > db.person.group({
    key:{name:true}, //如果是多个字段,可以为{name1:true,name2:true}
    initial:{age:0}, //initial表示$reduce函数参数prev的初始值
    $reduce:function(doc,prev){
    //reduce函数接受两个参数,doc表示正在迭代的当前文档,prev表示累加器文档。
       if(doc.age>prev.age){
                         prev.age=doc.age
                         }
    }
    })
    [
            {
                    "name" : "jason",
                    "age" : 30
            },
            {
                    "name" : "lorraine",
                    "age" : 25
            }
    ]
    

登录后回复
 

与 萌阔论坛 的连接断开,我们正在尝试重连,请耐心等待