Mongo查询list数组中一个字段大于特定条数
由于刚刚接触mongodb,很多语法还不是很了解,写的不好的地方请大佬指出
查询的demo数据
{
"_id":Object("xxxxxxxx"),
"contentList":[
"id":"xxxx",
"type":2
],
[
"id":"xxxx",
"type":2
] }
查询方法,使用聚合aggregate查询
match:将查询的contentList的size大于2的查出来
unwind:将集合根据contentList分组
match:再查出所有contentList的type为2的结果
group:再根据_id和total分组,total根据_id计算总数
match:过滤掉contentList的type小于3条的数据
project:结果集过滤,我只要id字段
db.getCollection('momPublishRecently').aggregate([
{"$match": {"contentList.2": {"$exists": 1}}},
{"$unwind": "$contentList"},
{"$match": {"contentList.type": 2}},
{"$group": {"_id":"$_id", "total": {"$sum":1}}},
{"$match": {"total": {"$gte": 3}}},
{"$project": {"total":0}}
]);
下面是springboot中的写法
Aggregation agg = Aggregation.newAggregation(
Aggregation.match(Criteria.where("contentList.2").exists(true)),
Aggregation.unwind("contentList"),
Aggregation.match(Criteria.where("contentList.type").is(2)),
Aggregation.group("_id").count().as("total"),
Aggregation.match(Criteria.where("total").gte(3)),
Aggregation.project("_id")
);
AggregationResults<IdDTO> results = getMongoTemplate().aggregate(agg, "表名", IdDTO.class);
List<IdDTO> list = results.getMappedResults();
List<ObjectId> idList = new ArrayList<>();
//这里转成object类型
if (!list.isEmpty()) {
list.stream().forEach(idDTO -> {
idList.add(new ObjectId(idDTO.getId()));
});
}
刚刚接触就要求写这样的,还是有点吃力的,花了不少时间,踩了不少mongo的坑
感谢以下资料:
https://www.cnblogs.com/zhoujie/p/mongo1.html
https://docs.spring.io/spring-data/mongodb/docs/2.0.5.RELEASE/reference/html/#mongo.aggregation
Mongo查询list数组中一个字段大于特定条数的更多相关文章
- js将数组中一个或多个字段相同的子元素中合并
最近js中遇到js将数组中一个或多个字段相同的子元素中合并,相信很多朋友也有遇到,大家可能有多种方法,我在这里记录一个相对简单的方法,当然大家如有其它更好的方法,请提出来大家共同学习. //将经济事项 ...
- 偶然在博客中见对百度一个面试题的探讨,写些自己的看法以及指出探讨中不对的观点:百度面试题:求绝对值最小的数 有一个已经排序的数组(升序),数组中可能有正数、负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现 例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4。
今天申请了博客园账号,在下班后阅览博客时发现了一个关于百度面试题探讨的博客(其实是个很基础的问题),此博客url为:http://www.blogjava.net/nokiaguy/archive/2 ...
- extract_by_one 根据二维数组中某字段来提取数组信息,查看有无重复信息
public function tt(){ $param = array( array ( 'hykno' => '2222222-CB', 'tcdk_fid' => '458B6D70 ...
- 查询每个分组中第N的一条记录
查询每个分组中第N的一条记录 -- 天气表,每天每个地区采集了多条记录的天气信息,但是时间只记录到了天,导致同一个地区同一天出现了多条天气记录 -- 目的:获取所有地区在每天中第N的一条记录 sele ...
- Android中一个类实现的接口数不能超过七个
近期一段时间,在开发Android应用程序的过程中,发现Android中一个类实现的接口数超过七个的时候,常常会出现超过第7个之后的接口不能正常使用.
- [LeetCode169]Majority Element求一个数组中出现次数大于n/2的数
题目: Given an array of size n, find the majority element. The majority element is the element that ap ...
- mybatis查询mysql 数据库中 BLOB字段,结果出现乱码
起因 mybatis-plus 通过Mapper 查询数据,映射出来的BLOB字段中的yml数据中文是乱码的 --- DefaultValue: '' Formula: '' HintContent: ...
- mysql 面试题 查询出表中某字段的重复值
users 表中有 两个字段 id 和 name 表数据大概如下: id name 1 AAA 2 BBB 3 CCC 4 AAA 请写查 ...
- Mysql 在 select 查询时追加(添加)一个字段并指定值
在特定时候,在 mysql 的查询结果中我们需要追加一个字段来实现某些特定的功能,这时我们可以用到以下语法来实现 值 as 字段比如我们需要给这个查询结果追加一个 xx 字段并赋值为 null ,可以 ...
随机推荐
- IO流学习之字节流(二)
字节流缓冲区: 1.BufferedInputStream 构造函数(以字节流为基础进行操作): 常用方法: 代码实例: package InputOutput; import java.io.Buf ...
- I Hate It HDU - 1754 线段树 单点修改+区间最值
#include<iostream> #include<cstring> using namespace std; ; int m,n,p; struct node{ int ...
- densenet思路 以及和残差网络区别,pytorch实现
densenet思路 以及和残差网络区别,pytorch实现 待办 densenet思路以及和残差网络区别.以及densenet的pytorch实现 https://zhuanlan.zhihu.co ...
- 让bat文件自动以管理员身份运行
· 让bat文件自动以管理员身份运行 如何让bat文件自动以管理员身份运行,将这段写在bat文件的前头即可 : %1 mshta vbscript:CreateObject("Shell.A ...
- 积分题1之来自G.Han的一道积分题
今天,收到G.Han的提问,第一个是计算积分 \[\int_0^{\infty}{\frac{\ln x}{(x^2+1)^n}dx}\]顿时不明觉厉,然后在宝典<Table of Integr ...
- PIE-SDK For C++矢量数据空间索引的创建
1.功能简介 空间索引的使用便于数据的查询:所以在创建矢量数据的时候创建空间索引,下面对矢量数据如何创建空间索引进行功能介绍. 2.功能实现说明 2.1 实现思路及原理说明 第一步 创建矢量要素数据集 ...
- C语言实现顺序栈
C语言实现顺序栈,顺便加深刻++i,++i的区别 #include <stdio.h>#include <stdlib.h>#define maxsize 100/*写在前面的 ...
- VSCode常用插件之vscode-fileheader使用
更多VSCode插件使用请访问:VSCode常用插件汇总 vscode-fileheader这是一个给js文件(html.css也可以使用,但是没意义!!!)生成头部注释的插件,每次修改js文件之后会 ...
- Hdu2099 整除的尾数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2099 Problem Description 一个整数,只知道前几位,不知道末二位,被另一个整数除尽了 ...
- Redis 数据总结(1 数据导入)
理论基础部分:http://www.redis.cn/topics/mass-insert.html 几百上千万的数据建议使用pipe来完成导入. 1.windows 下数据导入命令: type ou ...