我有一个具有以下文档结构的 MongoDB 集合:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder(toBuilder = true)
@Document
public class CustomerRouteManagementReportDocument implements TransactionDocument {
@Id
private String id;
@Indexed(unique = true)
private String customerId;
// ... other properties
private List<RouteHistoryEvent> routeHistoryEvents;
// ... other properties
}
本质上,以下方法应该执行批量更新插入:如果找到匹配的条目,它应该将
routeHistoryEvents
项中的第一项附加到现有文档的routeHistoryEvents
数组中。否则,应将一个全新的 CustomerRouteManagementReportDocument
插入到集合中。
@Service
@Slf4j
public class CustomerRouteManagementReportRepositoryAdapter extends AbstractRepositoryAdapter<CustomerRouteManagementReport, CustomerRouteManagementReportDocument, CustomerRouteManagementReportDataRepository> implements CustomerRouteManagementReportRepository {
private final MongoTemplate mongoTemplate;
@Autowired
public CustomerRouteManagementReportRepositoryAdapter(ModelMapper mapper, CustomerRouteManagementReportDataRepository repository, MongoTemplate mongoTemplate) {
super(mapper, repository, CustomerRouteManagementReport.class, CustomerRouteManagementReportDocument.class);
this.mongoTemplate = mongoTemplate;
}
//... other methods
@Override
public Integer upsertTall(List<CustomerRouteManagementReportDocument> customerRouteManagementReports) {
BulkOperations bulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.ORDERED, CustomerRouteManagementReportDocument.class);
try {
List<Pair<Query, Update>> updates = new ArrayList<>();
customerRouteManagementReports.stream().forEach(customerRouteManagementReport -> {
Query query = Query.query(Criteria.where("customerId").is(customerRouteManagementReport.getCustomerId()));
Update update = new Update();
update.addToSet("routeHistoryEvents").value(customerRouteManagementReport.getRouteHistoryEvents().get(0));
updates.add(Pair.of(query, update));
});
bulkOps.upsert(updates);
BulkWriteResult result = bulkOps.execute();
log.info("== BULK RESULT: {}, INSERTED: {}", result, result.getInsertedCount());
return result.getInsertedCount();
}
catch (Exception e) {
log.error("ERROR {}: IN UPSERTION {}", e.getClass().toGenericString(), e.getMessage());
return 0;
}
}
}
问题是没有进行任何更新或插入,也没有引发任何异常。我尝试过使用空集合和加载了满足
query
条件并且应该更新的文档的集合,但我的日志仅显示:
== BULK RESULT: AcknowledgedBulkWriteResult{insertedCount=0, matchedCount=4, removedCount=0, modifiedCount=4, upserts=[]}, INSERTED: 0
但是,在调试过程中,方法 is 被调用,并且它显示了与用例接收到处理的对象数量相应的
Pair
数量:
没有发出
MongoTemplate
日志(甚至对于我认为必须执行才能更新我的集合的 find
操作也没有),这让我认为我的班级可能没有适当的 MongoTemplate
配置。但是,也没有抛出任何连接错误。这是我们的 MongoDB 配置类:
@Configuration
@ConditionalOnProperty(name = "spring.data.mongodb.uri-report")
@EnableReactiveMongoRepositories(basePackages = "package name",
reactiveMongoTemplateRef = ReportMongoConfig.REPORT_REACTIVE_MONGO_TEMPLATE)
public class ReportMongoConfig {
protected static final String REPORT_REACTIVE_MONGO_TEMPLATE = "reportReactiveMongoTemplate";
@Value("${spring.data.mongodb.uri-report}")
private String connectionStringReport;
@Bean
public ConnectionString getConnectionDataBaseReport() {
return new ConnectionString(connectionStringReport);
}
@Bean
public ReactiveMongoTemplate reportReactiveMongoTemplate(MappingMongoConverter mappingMongoConverter) {
return new ReactiveMongoTemplate(reactiveReportMongoDatabaseFactory(getConnectionDataBaseReport()), mappingMongoConverter);
}
@Bean
public MongoTemplate mongoTemplate(MappingMongoConverter mappingMongoConverter) {
return new MongoTemplate(reportMongoDBFactory(getConnectionDataBaseReport()), mappingMongoConverter);
}
@Bean
public ReactiveMongoDatabaseFactory reactiveReportMongoDatabaseFactory(ConnectionString getConnectionDataBaseExperience) {
return new SimpleReactiveMongoDatabaseFactory(getConnectionDataBaseExperience);
}
@Bean
public MongoDbFactory reportMongoDBFactory(ConnectionString connectionString) {
return new SimpleMongoClientDbFactory(connectionString);
}
}
我想知道向存储库类提供适当的
MongoTemplate
bean 时是否存在注入问题,或者在 upsertAll
方法内构建的查询是否存在问题。
问题是没有进行更新或插入,也没有 也会引发异常。
日志
批量结果:AcknowledgedBulkWriteResult{insertedCount=0, matchedCount=4,removedCount=0,modifiedCount=4,upserts=[]}, 已插入:0
以上说法是错误的。从日志中可以清楚地看出,有 4 个更新 ->
matchedCount=4 modifiedCount=4
。
因此您需要检查为什么在更新插入期间有一个匹配触发更新而不是插入。