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 ,可以 ...
随机推荐
- C++-蓝桥杯-小计算器[进制转化][模拟]
#include <cstdio> #include <string> #include <cstring> #include <iostream> u ...
- Java基于SSM在线学习系统设计与实现
Spring+SpringMVC+MyBatis+Bootstrap+Vue开发在线学习系统 本课题的主要内容是开发基于Java EE的在线学习平台,使用MVC经典开发模式. ...
- Bootstrap资料
Bootstrap手册 : https://www.jqhtml.com/bootstraps-syntaxhigh/index.html 中文文档 :https://v3.bootcss.com/ ...
- 假期学习【六】Python网络爬虫2020.2.4
今天通过Python网络爬虫视频复习了一下以前初学的网络爬虫,了解了网络爬虫的相关规范. 案例:京东的Robots协议 https://www.jd.com/robots.txt 说明可以爬虫的范围 ...
- Java枚举类型的使用,数值的二进制表示
一.Java枚举类型的使用 首先请看这段代码: package java上课; public class EnumTest { public static void main(String[] arg ...
- linux基础安全
一.用户防护 Chage -l 用户名 查看用户账号有效期信息 Chage -E 时间 用户名 给用户设置过期时间 /etc/login.defs 文件保存许多默认设置 Pas ...
- Codeforces Round #617 (Div. 3) 题解
又是隔了一年才来补题的我 A.B水题就不用说了 C - Yet Another Walking Robot C题我居然卡了一会,最后决定用map水,结果出来看了看题解,居然真的是map...没想到会出 ...
- win10驱动签名禁用与启动
禁用:https://jingyan.baidu.com/article/624e74594dbc8d34e8ba5aa6.html?qq-pf-to=pcqq.c2c 启用或恢复:https://z ...
- TD - SimpleTextarea
html模板 <input dojoType="bootstrap.form.SimpleTextarea" dojoAttachPoint="assetDescr ...
- window.resizeTo
概述 动态调整窗口的大小. 语法 window.resizeTo(aWidth, aHeight) 参数 aWidth 是一个整数,表示新的 outerWidth(单位:像素)(包括滚动条.窗口边框等 ...