当前位置: 首页 > 知识库问答 >
问题:

Mongodb找到每个组中最新的并在spring boot实现

葛越
2023-03-14

我是MongoDB的新手。假设我有一个集合中的文档:

  [
        {
          _id: ObjectId("1"),
          uid: "test",
          obj: Object
                    name: "a",
                    field1: "..."
        },

        {
          _id: ObjectId("2"),
          uid: "test",
          obj: Object
                    name: "a",
                    field1: "..."
        },
        {
          _id: ObjectId("3"),
          uid: "test",
          obj: Object
                    name: "b",
                    field1: "..."
        },
         {
          _id: ObjectId("4"),
          uid: "test2",
          obj: Object
                    name: "b",
                    field1: "..."
        }
    ]

我想检索具有唯一obj.name的obj列表,预期输出为:

  [
      {
         _id: ObjectId("2") // not really necessary , just to show that the obj was under ObjectId("2")
         name: "a",
         field1: "..."
      },
      {
         _id: ObjectId("3") // not really necessary , just to show that the obj was under ObjectId("3")
         name: "b",
         field1: "..."
      }
    ]

我想做到这一点:

>

  • 首先匹配uid
  • 按_id desc对结果排序
  • 对象.名称分组

    [{$match:{uid:“test”}},{$sort:{_id:-1}},{$group:{_id:“$obj.name”}}]

    我得到的是:

    {
      _id:"a"
    },
    {
      _id:"b"
    }
    

    第二个问题:如何用spring boot mongo模板或其他spring boot mongo库进行这样的查询?

     Public class A {
           private String _id;
           private String uid;
           private Obj obj;
        }
    
        Public class Obj {
               private String name;
               private String field1;
        }
    

    在Java意义上,我想检索列表

    但不知道怎么做。

    非常感谢你的帮助。

  • 共有1个答案

    廖弘量
    2023-03-14

    这很简单。按照教程操作。

    添加以下代码:

    //Add this code to your service class
    @Autowired
    private MongoTemplate mongoTemplate;
    
    ...
    
    //Aggregation pipeline    
    Aggregation agg = Aggregation.newAggregation(
        Aggregation.match(Criteria.where("uid").is("test")),
        Aggregation.sort(Direction.DESC, "_id"),
        Aggregation.group("obj.name").first("obj").as("obj"),
        Aggregation.replaceRoot("obj")
    );
    
    AggregationResults<Obj> result = mongoTemplate.aggregate(agg, "collection", Obj.class).getMappedResults();
    //result.forEach(System.out::println);
    
     类似资料:
    • 我记录一个设备,每15分钟读取3个值(,,)。它们可以重复。 我需要找出每小时在该间隔内读取的12个值中最大的3个值是什么。我对它们何时发生不感兴趣,只对它们的值感兴趣。 目前,我的算法还远远不够高效和快速: 在每组中循环: 我想去掉这个循环,使用原生的pandas/numpy方法。可能吗? 编辑:在这篇文章的末尾提出了一个可行的解决方案 以下是代码: 回报: 解决方案 我在代码中实现这个解决方案

    • 问题内容: 我在MongoDB中有一个文档,其中一个看起来像这样: 在每个文档中,我需要找到最小的项目并将其删除。所以应该是这样的: 看起来应该在这里使用函数,但是我不能再说了。 如何找到数组中的最小元素并将其删除? 我正在使用MongoDB和Pymongo驱动程序。 问题答案: 如果您不限于一步就完成查询,则可以尝试: 步骤1)将聚合函数与$ unwind和$ group运算符配合使用,以查找每

    • 问题内容: 对于我的示例,拥有汽车对象,并根据模型(分组依据)发现了最小和最大价格值。 但是我找不到哪个汽车对象具有最高和最低价格。我怎样才能做到这一点? 问题答案: 如果您只对每个组感兴趣,则可以使用,例如 但是,由于您想要最昂贵和最便宜的产品,因此需要以下内容: 由于没有与之等效的通用统计对象,因此该解决方案带来了一些不便。如果这种情况不止一次发生,那么值得用这样的类填补空白: 将其添加到您的

    • 问题内容: 我有这张表 language_id是指记录所用的语言。我想做的是检索 每个language_id中 最近的五个记录(ORDER BY time_posted DESC LIMIT 5)的列表。我可以使用许多不同的SQL查询在PHP中循环执行此操作,但我觉得有一种更简单的方法。 我必须得到一本有关SQL的书,哈哈。 谢谢。 问题答案: 这是我在MySQL中解决此“每组前N个”类型的查询的

    • 如何在Cloud Firestore中查询每个CollectionGroup的最新文档? 组中每个收藏中只有一个文档,最近的!

    • 我收集了一些作者的文章。每个作者都有一个独特的签名或链接,出现在他们所有的文本中。 Author1的示例: Author1的预期输出为: Author2的示例: Author2的预期输出为: 请特别注意,没有可靠的识别字符(或位置)表示签名的开始或结束。它可以是一个url,一个Twitter地址,任何类型的纯文本,等等,任何长度,包含字符串开头、结尾或中间出现的任何字符序列。 我正在寻找一种方法,