如何在 Spring 数据 mongo 中查询生日

How to query for birthdays in Spring data mongo

我无法进行查询以获取今天生日的所有记录。我只需要匹配日期和月份

我尝试了很多组合,包括 $match 和 $expr。似乎没有任何效果。

public interface GenericPolicyRepository extends MongoRepository<GenericPolicy, String> {
    @Query("{ 'agentId': ?0 , '$expr': { '$eq': [{ '$month': '$dateOfBirth' }, ?1]}, '$expr': { '$eq': [{ '$dayOfMonth': '$dateOfBirth' }, ?2]}}")
    public List<GenericPolicy> findAllBirthDaysByAgent(String agentId, String month, String day);
}

//通用策略class

@Document("Policy")
public class GenericPolicy {  
    @Id
    private String policyId;

    private String agentId;
    private String insuredUserId;
    private String status;
    private Date policyStartDate;
    private Date policyEndDate;
    private String paymentReferenceNumber;
    private BigInteger premium;
    private Date dateofSubmission;
    private String submissionStatus;
    private InsuredDetails insuredDetails;
}

//保险详情

 public class InsuredDetails {

        @NotNull
        private String nationality;
        @NotNull
        private String fullName;
        @NotNull
        private String gender;
        @NotNull
        private Date dateOfBirth;
        @NotNull
        private String identityType;
        @NotNull
        private String identityNumber;
        @NotNull
        @Email
        private String emailaddress;
        @NotNull
        @Size(max = 10,min = 10)
        private String mobileNumber;
        @NotNull
        private String addressLine1;
        @NotNull
        private String addressLine2;
        @NotNull
        private String postCode;
    }

在下面的查询中尝试,其中 dateOfBirth 是保存在您的集合中的键在这里我们将当前日期的月份和月份与集合中存储的相匹配

  {
            $expr: {
                        "$and": [
                            {"$eq": [{"$dayOfMonth": "$dateOfBirth"}, {"$dayOfMonth": new Date()}]},
                            {"$eq": [{"$month": "$dateOfBirth"}, {"$month": new Date()}]}
                        ]
                    }
  }

根据提到的 类,给定的文档有一个嵌套文档 insuredDetails(假设在 db 中也是同名的)。该字段有 dateOfBirth 字段。记住这个事实,查询可以写成如下。

public interface GenericPolicyRepository extends MongoRepository<GenericPolicy, String> {
    @Query("{'agentId': ?0 , '$expr': {'$and': [{'$eq': [{'$dayOfMonth': '$insuredDetails.dateOfBirth'}, {'$dayOfMonth': ?1}]}, {'$eq': [{'$month': '$insuredDetails.dateOfBirth'}, {'month': ?1}]}]}}")
    public List<GenericPolicy> findAllBirthDaysByAgent(String agentId, Date birthDate);
}

用法

public class GenericPolicyServiceImpl implements GenericPolicyService {

    @Autowired
    GenericPolicyRepository genericPolicyRepository;

    public List<GenericPolicy> getAllBirthDaysByAgent(String agentId, String month, String day){
        Calendar c = Calendar.getInstance();
        int month = Integer.parseInt(month);
        int day = Integer.parseInt(day);
        c.set(0, month, day, 0, 0);
        Date birthDate = c.getTime();
        genericPolicyRepository.findAllBirthDaysByAgent(agentId, birthDate);
    }
}