java - MongoDB 和 Spring Data - 与组的聚合返回错误的 ID

标签 java mongodb spring-data-mongodb

我有以下 MongoDB 文档:

@Data
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@SuperBuilder
@Document(collection = ReasonDocument.COLLECTION)
public class ReasonDocument extends BaseDocument<ObjectId> {
  public static final String COLLECTION = "reasons";

  @Id
  private ObjectId id;
  @Indexed
  private ObjectId ownerId;
  @Indexed
  private LocalDate date;
  private Type type;
  private String reason;
}

我想获取具有最新日期ownerId的所有行,并另外过滤掉其中的一些行。我为此编写了自定义存储库,其中我使用带有组语句的聚合:

public class ReasonsRepositoryImpl implements ReasonsRepository {

  private final MongoTemplate mongoTemplate;

  @Autowired
  public ReasonsRepositoryImpl(MongoTemplate mongoTemplate) {
    this.mongoTemplate = mongoTemplate;
  }

  public List<ReasonDocument> findReasons(LocalDate date) {
    final Aggregation aggregation = Aggregation.newAggregation(
      sort(Direction.DESC, "date"),
      group("ownerId")
        .first("id").as("id")
        .first("reason").as("reason")
        .first("type").as("type")
        .first("date").as("date")
        .first("ownerId").as("ownerId"),
      match(Criteria.where("date").lte(date).and("type").is(Type.TYPE_A))
    );
    return mongoTemplate.aggregate(aggregation, "reasons", ReasonDocument.class).getMappedResults();
  }
}

这是智能查询,但不幸的是它在测试时返回损坏的行:

java.lang.AssertionError: 
Expecting:
  <[ReasonDocument(id=5dd5500960483c1b2d974eed, ownerId=5dd5500960483c1b2d974eed, date=2019-05-14, type=TYPA_A, reason=14),
    ReasonDocument(id=5dd5500960483c1b2d974ee8, ownerId=5dd5500960483c1b2d974ee8, date=2019-05-15, type=TYPA_A, reason=1)]>
to contain exactly in any order:
  <[ReasonDocument(id=5dd5500960483c1b2d974eef, ownerId=5dd5500960483c1b2d974ee8, date=2019-05-15, type=TYPA_A, reason=1),
    ReasonDocument(id=5dd5500960483c1b2d974efc, ownerId=5dd5500960483c1b2d974eed, date=2019-05-14, type=TYPA_A, reason=14)]>
elements not found:
  <[ReasonDocument(id=5dd5500960483c1b2d974eef, ownerId=5dd5500960483c1b2d974ee8, date=2019-05-15, type=TYPA_A, reason=1),
    ReasonDocument(id=5dd5500960483c1b2d974efc, ownerId=5dd5500960483c1b2d974eed, date=2019-05-14, type=TYPA_A, reason=14)]>
and elements not expected:
  <[ReasonDocument(id=5dd5500960483c1b2d974eed, ownerId=5dd5500960483c1b2d974eed, date=2019-05-14, type=TYPA_A, reason=14),
    ReasonDocument(id=5dd5500960483c1b2d974ee8, ownerId=5dd5500960483c1b2d974ee8, date=2019-05-15, type=TYPA_A, reason=1)]>

返回的idownerId相同。
谁能说一下查询出了什么问题吗?

最佳答案

我不完全确定这是否是问题所在。但是你检查过mongo是如何保存ID的吗?因为即使您按所有者 ID 进行分组。如果 mongo 已将项目保存在 Json 中的 _id header 下。然后你需要将其引用为_id

例如:如果看起来像这样

{ “_id”:“2893u4jrnjnwfwpfn”, “名称”:“ Jenkins ” }

那么你的groupBy应该是groupBy(_id)而不是你写的。

关于java - MongoDB 和 Spring Data - 与组的聚合返回错误的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58956416/

相关文章:

java - 如何使用 Quickbooks Online v3 Java SDK 向客户发送发票电子邮件?

java - MongoDB - Spring Data - 在保存条件时增加字段

json - mongoexport JSON 断言 : 10340 Failure parsing JSON string

MongoDB bson.M 查询

mongodb - 无法运行 mongodb 因为核心转储问题?

Spring 启动 mongodb java.lang.NoClassDefFoundError : com/mongodb/MongoException$DuplicateKey

java - Spring Data Mongo 1.9版本已连接但无法进行CRUD操作

java - 用于为方法添加时间戳的自定义注释

java - HibernateTemplate.find 返回正确的行数,但数据相同

java - CloudBees 的 JMS 代理选项?