如何使用 Spring 数据 MongoDB 定位查询中数组的最后一项?

How to target the last item of an array in a query using Spring Data MongoDB?

假设有一组博客文章,每篇文章都有一系列评论。评论数组的最后一条评论总是最新的。

{
  subject: "This is my post",
  comments: [
   {"priority": "HIGH", "text": "Hello, my name is...", "createdAt": ISODate("2021-01-18T09:51:32.000Z")},
   {"priority": "MEDIUM", "text": "I agree", "createdAt": ISODate("2021-01-19T09:51:32.000Z")},
   {"priority": "LOW", "text": "Nice post", "createdAt": ISODate("2021-01-20T09:51:32.000Z")}
 ]
}

我想创建一个查询:

Give me all the blog posts whose most recent comment has priority "HIGH"

我尝试过的:

        Query query = new Query();
        List<Criteria> criteriaList = new ArrayList<>();
        // other filters added to the criteria list here
        CommentPriority priorityEnum = CommentPriority.valueOf("HIGH");
        criteriaList.add(Criteria.where("comments.-1.priority").is(priorityEnum);
        query.addCriteria(new Criteria().andOperator(criteriaList.toArray(new Criteria[criteriaList.size()])));
        List<BlogPost> posts = mongoOperations.find(query, BlogPost.class);

这 returns 结果是一个空数组,即使集合中有博客文章的最后一条评论具有高优先级也是如此

        Query query = new Query();
        List<Criteria> criteriaList = new ArrayList<>();
        // other filters added to the criteria list here
        CommentPriority priorityEnum = CommentPriority.valueOf("HIGH");
        criteriaList.add(Criteria.where("comments.priority").is(priorityEnum);
        query.addCriteria(new Criteria().andOperator(criteriaList.toArray(new Criteria[criteriaList.size()])));
        List<BlogPost> posts = mongoOperations.find(query, BlogPost.class);

这 returns 所有至少有一条评论优先级 = 高的博文,这不是我想要的

有什么想法吗?

点符号中的负数位置未记录在案 MongoDB 功能。

不是查看数组,而是将最近评论的评论优先级提高到 post - 在添加评论时将其设置在 post 上。然后你可以简单地通过“最近的评论优先级 post = 高”来查询,而不需要进入数组。