java - MongoDB 和 Spring Data - 与组的聚合返回不正确的 id
问题描述
我有以下 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
最新的行,date
并另外过滤掉其中的一些。我为此编写了自定义存储库,我在其中使用了带有组语句的聚合:
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)]>
返回的id
与 相同ownerId
。
谁能说查询有什么问题?
解决方案
我不完全确定这是否是问题所在。但是你检查过 mongo 是如何保存 ID 的吗?因为即使您按 ownerID 分组。如果 mongo 已将项目保存在您的 Json 中的 _id 标头下。然后你需要将它称为_id
例如:如果它看起来像这样
{“_id”:“2893u4jrnjnwfwpfn”,“名称”:“詹金斯”}
那么你的 groupBy 应该是 groupBy(_id) 而不是你写的。
推荐阅读
- c# - OmniSharp 失败:无法创建任务“GetReferenceNearestTargetFrameworkTask”
- docker - 在 Docker 容器中使用 Rviz 和 Gazebo 时出错
- python - 使用 pandas parse_date 时出现错误
- vue.js - Vuex-ORM 双向数据绑定无法观察嵌套对象
- javascript - 承诺在后台同步
- javascript - 什么时候应该在 Typescript 中显式添加类型注释?
- angular - 如何使用 .then 在对象中显示 Contents.Category 数组
- groovy - 检查一个列表是否包含来自 groovy 中另一个列表的元素
- pandas - Pandas - 列中唯一字符串的列表
- python - 如何使用 selenium Python 定期重新登录?