Spring数据MongoDB无法在组聚合中映射_id

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring数据MongoDB无法在组聚合中映射_id相关的知识,希望对你有一定的参考价值。

我正在使用Spring Data MongoDB生成聚合查询。有一次我这样做:

// 5. Rejoin the array with group.
group("email", "name", "surname", "birthday", "creationTime", "updateTime", "technology")
  .push(SCORES_FIELD).as(SCORES_FIELD));

生成的步骤(在日志中)是这样的:

"$group" : { 
    "_id" : { 
        "email" : "$_id",
        "name" : "$name" ,
        "surname" : "$surname" , 
        "birthday" : "$birthday" , 
        "creationTime" : "$creationTime" , 
        "updateTime" : "$updateTime" , 
        "technology" : "$technology"
    } ,
    "scores" : { "$push" : "$scores"}
}

这是非常好的,我已经在Mongo shell上测试了它,并准确地回馈了我想要的东西。

问题是,当我对Spring Data执行相同操作时,电子邮件字段(Mongo中的_id字段)将映射为null。我的映射可能有些不对劲但我无法弄清楚究竟是什么。这是模型:

@Document(collection = "user")
public class User implements UserDetails {

    private static final long serialVersionUID = 1L;
    private String name;
    private String surname;
    private LocalDate birthday;

    @Id
    @Field("_id")
    private String email;
    private Collection<? extends GrantedAuthority> authorities;
    private String password;
    private Set<Score> scores;
    private LocalDateTime creationTime;
    private LocalDateTime updateTime;
    private String technology;

    // Getters and setters, hashmap, equals and toString

}

我已经完成了其他查询,一切都很完美。我只有这个问题,这是我做的唯一聚合。

答案

推广我的评论回答。

_id无法映射到电子邮件,因为组阶段在_id文档中返回多个键。 previousOperation()只是一种方便的方法,可以从之前的组操作中返回_id。您可以尝试更改为group("email").first("name").as("name")....,看看它是否有帮助。

我希望spring能够从模型中读取Field注释,并将_id字段映射回电子邮件。

以上是关于Spring数据MongoDB无法在组聚合中映射_id的主要内容,如果未能解决你的问题,请参考以下文章

mongodb 在组中的相等条件无法正常工作

Spring MongoDB 数据聚合中的错误引用

使用 MongoDB 进行 Spring Boot 数据聚合

如何在 Spring Boot 中使用特定日期范围和聚合从 MongoDB 数据库中检索数据?

从String到ObjectId的Spring数据MongoDb聚合查找

在 Spring Boot Mongodb 中使用聚合框架按计数查找组