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

原文地址:https://www.cnblogs.com/oldboyooxx/p/12041524.html

时间: 2024-11-18 12:38:34

Mongo查询list数组中一个字段大于特定条数的相关文章

ORACLE,SQLSERVER等数据库如何获取某张表中相同字段最近一条数

SELECT * FROM ( SELECT JBXX.*,row_number() OVER (partition BY WRYMC ORDER BY WRYMC,CJSJ DESC) R FROM T_WRY_JBXX  JBXX ) A WHERE R=1

算法之找出数组中出现次数大于n/m的元素

最经典的题目莫过于是: 在一个数组中找出出现次数超过n/2的元素?更进一步的,找出数组中出现次数大于n/3的所有元素? 注:这里有一个很重要的事实,那就是出现次数大于n/m的元素的个数至多为(m-1)个,比如出现次数大于n/3的至多只有两个. 关于这一类题目的解题思路,可以先讲一个游戏 称作 "俄罗斯方块".这里的规则是每一行的元素要完全不一样,一样的元素则总是在同一列,如果最下面的行已经被填满,那么消除最下面的行. 例如在数组 A = {7,3,3,7,4,3,4,7,3,4,3,4

偶然在博客中见对百度一个面试题的探讨,写些自己的看法以及指出探讨中不对的观点:百度面试题:求绝对值最小的数 有一个已经排序的数组(升序),数组中可能有正数、负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现 例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4。

今天申请了博客园账号,在下班后阅览博客时发现了一个关于百度面试题探讨的博客(其实是个很基础的问题),此博客url为:http://www.blogjava.net/nokiaguy/archive/2013/01/30/394920.html 其中下面有人评论为: 有序列表查找显然二分啊,博主貌似对java的arrays和collections不是很熟. private static int getMinAbsoluteValue(final int[] source) { int index

5.oracle中一个字段中存储&#39;a&#39;,&#39;b&#39;与&#39;a&#39;与a的写法,存储过程中与之对应

select '''a'',''b''' from dual; --'a','b' select '''a''' from dual; --'a' select 'a' from dual; --a 5.oracle中一个字段中存储'a','b'与'a'与a的写法,存储过程中与之对应

算法题1 数组中唯一出现1次的数|唯一出现2次的数

题目描述:一个整型数组里除了1个数字之外,其他的数字都出现了两次,请写程序找出这个只出现一次的数字.要求时间复杂度是 O(n),空间复杂度是 O(1),例如输入数组{2, 4, 3, 3, 2, 5 },因为只有 4 这个数字只出现一次,其他数字都出现了两次,所以输出 4 思路分析:本题以及延伸题目,在剑指offer上有详细描述.利用异或的特性,x^y^x=y^x^x=y.对数组所有元素一次进行异或操作,最终得到的值就是那个只出现一次的数字 代码 1 int FindOnceNum(int ar

【白话经典算法系列之十七】 数组中只出现一次的数 其他三次

本文地址:http://blog.csdn.net/morewindows/article/details/12684497转载请标明出处,谢谢. 欢迎关注微博:http://weibo.com/MoreWindows 首先看看题目要求: 数组A中,除了某一个数字x之外,其他数字都出现了三次,而x出现了一次.请给出最快的方法找到x. 这个题目非常有意思,在本人博客中有<位操作基础篇之位操作全面总结>这篇文章介绍了使用位操作的异或来解决——数组中其他数字出现二次,而x出现一次,找出x.有<

在相邻元素相差1的数组中查找某一特定元素第一次出现的位置

题目:数组中相邻的每两个数之间的差值是1或-1,给定一个数N,求如何找到第一个N的位置. 如:3,4,3,2,1,2,3,4,3,4,5,6,5   求第一个5所在的位置. #include <stdio.h> #include <stdlib.h> int main(void) { int a[] = {3,4,3,2,1,2,3,4,3,4,5,6,5}; int i, next, to_search; int len = sizeof(a); int count = 0, f

删除表中重复记录大于两条保存两条

--删除表中重复记录大于两条保存两条delete from t_Cht_clm_reg F where F.case_id in (select T.case_id from (select B.* from (select e.* , row_number() over (partition by e.notice_id order by e.case_id desc) rn from t_Cht_clm_reg e) B where B.notice_id in(select A.notic

[LeetCode169]Majority Element求一个数组中出现次数大于n/2的数

题目: Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times. You may assume that the array is non-empty and the majority element always exist in the array. 思路:可以利用Dictionary将数组中每个数