MongoDB中的分组

.MongoDB中的Count函数、Distinct函数以及分组

 准备工作,插入一个班级的文档

> for(var i=0;i<10;i++){

... db.Classes.insert({ClassName:"Class"+i,_id:i});

... }

WriteResult({ "nInserted" : 1 })

> db.Classes.find()

{ "_id" : 0, "ClassName" : "Class0" }

{ "_id" : 1, "ClassName" : "Class1" }

{ "_id" : 2, "ClassName" : "Class2" }

{ "_id" : 3, "ClassName" : "Class3" }

{ "_id" : 4, "ClassName" : "Class4" }

{ "_id" : 5, "ClassName" : "Class5" }

{ "_id" : 6, "ClassName" : "Class6" }

{ "_id" : 7, "ClassName" : "Class7" }

{ "_id" : 8, "ClassName" : "Class8" }

{ "_id" : 9, "ClassName" : "Class9" }

>

 

1.count函数

如上面,如果要统计班级的数目,可以使用count函数进行统计

> db.Classes.find().count()

10

>

 

2.Distinct函数

修改一下Classes文档,添加一条重复的数据

> db.Classes.insert({_id:10,ClassName:"Class9"})

WriteResult({ "nInserted" : 1 })

> db.Classes.find()

{ "_id" : 0, "ClassName" : "Class0" }

{ "_id" : 1, "ClassName" : "Class1" }

{ "_id" : 2, "ClassName" : "Class2" }

{ "_id" : 3, "ClassName" : "Class3" }

{ "_id" : 4, "ClassName" : "Class4" }

{ "_id" : 5, "ClassName" : "Class5" }

{ "_id" : 6, "ClassName" : "Class6" }

{ "_id" : 7, "ClassName" : "Class7" }

{ "_id" : 8, "ClassName" : "Class8" }

{ "_id" : 9, "ClassName" : "Class9" }

{ "_id" : 10, "ClassName" : "Class9" }

 

现在我想查询所有ClassName,去掉重复的,可以执行下面的操作。

> db.runCommand({distinct:"Classes",key:"ClassName"}).values

[

        "Class0",

        "Class1",

        "Class2",

        "Class3",

        "Class4",

        "Class5",

        "Class6",

        "Class7",

        "Class8",

        "Class9"

]

>

去重语法 db.runCommand({distinct:"数据集合名字",key:"需要去重的键"}).values

 

3.Group分组操作(比较复杂)

语法:

db.runCommand({group:{

        ns:集合名字,

 Key:分组的键对象,

 Initial:初始化累加器,

 $reduce:组分解器,

 Condition:条件,

 Finalize:组完成器

      }})

 

 1).key:用来分组文档的字段。和keyf两者必须有一个

 2).keyf:可以接受一个javascript函数。用来动态的确定分组文档的字段。和key两者必须有一个

 3).initial:reduce中使用变量的初始化

 4).reduce:执行的reduce函数。函数需要返回值。

 5).cond:执行过滤的条件。

 6).finallize:在reduce执行完成,结果集返回之前对结果集最终执行的函数。可选的。

 

具体的使用可以参考手册:http://mongodb-documentation.readthedocs.org/en/latest/reference/command/group.html

分组首先会按照key进行分组,每组的 每一个文档全要执行$reduce的方法,他接收2个参数一个是组内本条记录,一个是累加器数据.

 

新建一个persons集合,插入一下数据

var persons = [{

name:"Tom",

age:25,

country:"USA"

},

{

name:"Jack",

age:25,

country:"USA"

},

{

name:"Lucy",

age:26,

country:"USA"

},

{

name:"DaChengzi",

age:27,

country:"China"

},

{

name:"Xiaojuz",

age:26,

country:"China"

},

{

name:"DaPingguo",

age:27,

country:"China"

},

{

name:"XiaoBoluo",

age:27,

country:"China"

},

{

name:"Bangzi1",

age:26,

country:"Korea"

},

{

name:"LiShishi",

age:27,

country:"Korea"

},

{

name:"Rain",

age:21,

country:"Korea"

},

{

name:"CangJingkong",

age:30,

country:"Japan"

}]

for(var i = 0;i<persons.length;i++){

db.persons.insert(persons[i])

}

插入完成后,查看一下:

 

现在我有一个需求,想要找到每个国家当中年纪最大的人,并且年纪不大于30岁,输出他们的名字

 

思路: ①先按照国家进行分组

         ②找到每个国家中年纪最小的

         ③判断年纪是不是小于30

 

编写查询:

db.runCommand({group:{

ns:"persons",

key:{"country":true},

initial:{age:0},

$reduce:function(doc,prev){

if(doc.age>prev.age){

prev.age=doc.age;

prev.name = doc.name;

prev.country = doc.country;

}

},

condition:{age:{$lt:30}}

}})

 

运行结果:

{

        "retval" : [

         {

              "country" : "USA",

               "age" : 26,

                        "name" : "Lucy"

                },

                {

                        "country" : "China",

                        "age" : 27,

                        "name" : "DaChengzi"

                },

                {

                        "country" : "Korea",

                        "age" : 27,

                        "name" : "LiShishi"

                }

        ],

        "count" : 10,

        "keys" : 3,

        "ok" : 1

}

 

从结果看到日本女士苍井空的年龄是30,被我筛选掉了…...

 

Finallize的使用,如果觉得返回的东西太过单调,可以使用finalize进行再次的修改

 

例如:

db.runCommand({group:{

ns:"persons",

key:{"country":true},

initial:{age:0},

$reduce:function(doc,prev){

if(doc.age>prev.age){

prev.age=doc.age;

prev.name = doc.name;

prev.country = doc.country;

}

},

finalize:function(prev){

prev.age = "Age is" +prev.age;

prev.name = "Name is " + prev.name;

prev.country = "Country is " + prev.country;

},

condition:{age:{$lt:30}}

}})

 

加上上面之后,查询的结果如下:

{

        "retval" : [

                {

                        "country" : "Country is USA",

                        "age" : "Age is26",

                        "name" : "Name is Lucy"

                },

                {

                        "country" : "Country is China",

                        "age" : "Age is27",

                        "name" : "Name is DaChengzi"

                },

                {

                        "country" : "Country is Korea",

                        "age" : "Age is27",

                        "name" : "Name is LiShishi"

                }

        ],

        "count" : 10,

        "keys" : 3,

        "ok" : 1

}

可以看到每一项数据前面,都加上了说明文字,所以说finialize是可以对分完组之后的数据在做一次修改的。

 

.命令执行器(db.runCommand())

1.之前我们遇到删除集合,一般使用的方法是 db.集合名.drop()

使用命令执行器:

db.runCommand({drop:"集合"})

 

2.查找MongoDB为我们提供的命令

①在shell中执行:db.listCommands()

②访问网址http://127.0.0.1:28017/_commands

 

3.常用命令

.固定集合(Capped Collection

1.解释:就是固定size的集合呗。

2.特点:性能出色的有着固定大小的集合,以LRU(Least Recently Used最近最少使用)规则和插入顺序进行age-out(老化移出)处理,自动维护集合中对象的插入顺序,在创建时需要预先指定大小。如果空间用完,新添加的对象将会取代集合中最旧的对象永远保持最新的数据

总结就是以下:

①固定集合默认是没有索引的就算是_id也是没有索引的

②由于不需分配新的空间他的插入速度是非常快的

③固定集合的顺是确定的导致查询速度是非常快的

④最适合的是应用就是日志管理

3.使用

①创建一个固定集合

  创建一个新的固定集合要求大小是100个字节,可以存储文档10

 > db.createCollection("myCapped",{size:100,capped:true,max:10})

    { "ok" : 1 }

 >

 

②把一个普通集合转成固定集合

> db.runCommand({convertToCapped:"Classes",size:100000})

{ "ok" : 1 }

>

 

③插入数据

文档最大为10个,那么当插入11条数据的时候,会出现什么情况呢,根据之前的概念,应该是吧第一条数据踢出去,然后加入最后一条

> for(var i = 0; i<11;i++){

... db.myCapped.insert({name:"name"+i,_id:i})

... }

WriteResult({ "nInserted" : 1 })

> db.myCapped.find()

{ "_id" : 1, "name" : "name1" }

{ "_id" : 2, "name" : "name2" }

{ "_id" : 3, "name" : "name3" }

{ "_id" : 4, "name" : "name4" }

{ "_id" : 5, "name" : "name5" }

{ "_id" : 6, "name" : "name6" }

{ "_id" : 7, "name" : "name7" }

{ "_id" : 8, "name" : "name8" }

{ "_id" : 9, "name" : "name9" }

{ "_id" : 10, "name" : "name10" }

>

> db.myCapped.insert({name:"name11",_id:11})

WriteResult({ "nInserted" : 1 })

> db.myCapped.find()

{ "_id" : 2, "name" : "name2" }

{ "_id" : 3, "name" : "name3" }

{ "_id" : 4, "name" : "name4" }

{ "_id" : 5, "name" : "name5" }

{ "_id" : 6, "name" : "name6" }

{ "_id" : 7, "name" : "name7" }

{ "_id" : 8, "name" : "name8" }

{ "_id" : 9, "name" : "name9" }

{ "_id" : 10, "name" : "name10" }

{ "_id" : 11, "name" : "name11" }

>

④删除数据

> db.myCapped.remove({_id:11})

WriteResult({

        "nRemoved" : 0,

        "writeError" : {

                "code" : 10101,

                "errmsg" : "cannot remove from a capped collection: mongoDBTest.myCapped"

        }

})

>

如上例,固定集合是不能进行数据删除的。

综上:固定集合有点像一个队列,先进先出,大小不变。

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/dcz2015/p/5314273.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/285347.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 .NET 6 项目中使用 Startup.cs

对于 .NET 6 项目&#xff0c;现在已经找不到 Startup.cs 文件。默认情况下&#xff0c;此文件已经被删除&#xff0c;并且 Program.cs 是配置依赖注入服务和 Middleware 的新位置。但是&#xff0c;有些人可能更喜欢使用 Startup.cs , 并且我也是&#xff0c;可能已经习惯了&a…

编写iptables脚本实现IP地址、端口过滤

实验案例&#xff1a;公司使用一台运行RHEL5系统的服务器作为网关&#xff0c;分别连接三个网络&#xff0c;其中LAN1为普通员工电脑所在的局域网&#xff0c;LAN2为DNS缓存服务器所在的局域网。eth0通过10M光纤接入Internet。为了有效的管理网络环境及增强内部网络的安全性&am…

让VS Code 支持 Jupyter Notebook

一、Jupyter Notebook Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算&#xff1a;开发、文档编写、运行代码和展示结果。——Jupyter Notebook官方介绍。 Jupyter Notebook是以网页的形式打开&#xff0c;可以在网页页面中直接编写代码和运行代…

C语言试题128之对 10 个数进行排序

✅作者简介:大家好我是码莎拉蒂,CSDN博客专家🥇🥇🥇 📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 1、题目 题目:对 10 个数进行排序 分析:可以利用选择法,即从后 9 个比较过程中,选择一个最小的与…

Windows 11 23H2 25145 推送!全新隐私设置和 OneDrive 体验

面向 Dev 频道的 Windows 预览体验成员&#xff0c;微软现已推送 Windows 11 预览版 Build 25145。主要变化1.微软宣布为 Windows 11 设置引入全新 OneDrive 体验&#xff0c;您可以在设置中查看 OneDrive 云存储服务的订阅详情&#xff0c;包括付费方式、容量大小和定期付费等…

用jekyll制作高大上的网站(二)——实际应用

最近公司要制作个文档库&#xff0c;直接就可以将jekyll应用到实际中。 模版使用了Jekyll Clean&#xff0c;这么模版相对内部简单一点&#xff0c;学习成本不会很大&#xff0c;而复杂的Minimal Mistakes就当作参考。 模版使用的CSS是Bootstrap v3.2.0版本的。为了省时点&…

C语言试题129之求一个 3乘3 矩阵对角线元素之和

✅作者简介:大家好我是码莎拉蒂,CSDN博客专家🥇🥇🥇 📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 1、题目 题目:求一个 3乘3 矩阵对角线元素之和 分析:利用双重 for 循环控制输入二维数组,再将 a[…

ssh key生成

Mac电脑用终端生成SSH key 访问自己的Github 字数684 阅读427 评论4 喜欢15前言&#xff1a;最近有不少刚刚使用github管理代码的开发者或者新手码农在网上 问我如何关联自己的github&#xff0c;今天就写篇文章仅供参考。一、首先你要检测自己电脑是否存在 SSH key 在终端输出…

[转]小白都能看懂的softmax详解

1.softmax初探 在机器学习尤其是深度学习中&#xff0c;softmax是个非常常用而且比较重要的函数&#xff0c;尤其在多分类的场景中使用广泛。他把一些输入映射为0-1之间的实数&#xff0c;并且归一化保证和为1&#xff0c;因此多分类的概率之和也刚好为1。 首先我们简单来看看s…

MAUI 入门教程系列(5.XAML及页面介绍)

前言作为微软的UI框架&#xff0c;除了Winform以外&#xff0c;多数是以创建XAML文件的方式来编写前端的页面&#xff0c;尽管你也可以通过C#代码来编写你的用户界面&#xff0c;与Xamarin.Forms相同&#xff0c;在MAUI上编写XAML的声明方式与其相同&#xff0c;重构了底层部分…

蓝牙mesh网络基础

蓝牙mesh网络基础转载于:https://blog.51cto.com/11534544/2044130

Linux系统开机自启流程

第一步&#xff1a;POST&#xff08;Power On Safe Test&#xff09;加电自检当按下电源键以后&#xff0c;CPU因为有电流通过便开始对自身、I/O设备、内存等硬件进行检验。那么CPU如何得知这些自检指令&#xff1f;我们知道指令存在于内存当中&#xff0c;寻找内存也需要指令。…

ArcGIS空间数据:矢量和栅格数据结构详解

文章目录 矢量数据结构矢量数据简介Shapefile矢量格式栅格数据结构地理数据库中的栅格栅格管理策略栅格数据的地理属性栅格的地理属性通常包括地理数据集中的栅格块表实体栅格表示矢量数据结构 矢量数据简介 基于矢量数据模型的数据结构简称矢量数据结构,是通过记录实体坐标…

C语言试题130之有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中

✅作者简介:大家好我是码莎拉蒂,CSDN博客专家🥇🥇🥇 📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 1、题目 题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中 分析:先判…

[转]一文读懂目标检测:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/kwame211/article/details/88016151 一、目标检测常见算法 object detection&#xff0c;就是在给定的图片中精确找到物体所在位置&#xff0c;并标注出物体的类别。所以&a…

在代码中使用度量单位,从而生活更美好

在我们的应用软件中&#xff0c;涉及到物理化学计算时&#xff0c;只有 Frink 、F#、Modelica 少数语言变量是自带单位的&#xff0c;大部分语言变量仅包含数值&#xff0c;单位转换需要在变量进行公式计算之前完成&#xff0c;计算后再把结果单位转换为输出单位&#xff0c;单…

C#(Sharp)进阶篇:文件操作

文章目录 8.1 文件系统概述8.2 驱动器、目录和文件8.2.1 与IO操作相关的枚举8.2.2 驱动器8.2.3 目录8.2.4 文件8.3 文件流和数据流8.3.1 抽象类Stream8.3.2 文件流FileStream8.3.3 流的文本读写器8.3.4 流的二进制读写器8.3.5 常用的其他流对象8.4 应用实例8.1 文件系统概述

shell中字符串操作【转】

转自&#xff1a;http://blog.chinaunix.net/uid-29091195-id-3974751.html 我们所遇到的编程语言中(汇编除外)都少不了字符串处理函数吧&#xff0c; 当然shell编程也不例外咯&#xff0c;那么下面我们一起来看下shell中字符串 处理的相关操作吧。大概下面的字符串操作可以分为…

[转]神经网络框架

Pytorch上手使用 近期学习了另一个深度学习框架库Pytorch&#xff0c;对学习进行一些总结&#xff0c;方便自己回顾。 Pytorch是torch的python版本&#xff0c;是由Facebook开源的神经网络框架。与Tensorflow的静态计算图不同&#xff0c;pytorch的计算图是动态的&#xff0c;可…

10分钟实现dotnet程序在linux下的持续部署

背景 一直以来&#xff0c;程序署都是非常麻烦且无聊的事情&#xff0c;在公司一般都会有 devops 方案&#xff0c;整个 cicd 过程涉及的工具还是挺多的&#xff0c;搭建起来比较麻烦。那么对于一些自己的小型项目&#xff0c;又不想搭建一套这样的环境&#xff0c;怎么办呢。。…