Java 如何将MongoDB查询转换为Spring数据查询
我正在尝试转换以下Mongo查询以用于Spring数据Java 如何将MongoDB查询转换为Spring数据查询,java,spring,mongodb,spring-data,spring-mongodb,Java,Spring,Mongodb,Spring Data,Spring Mongodb,我正在尝试转换以下Mongo查询以用于Spring数据 db.product.aggregate([ {$unwind: '$barcodes'}, {$project: { _id: 0, productId: '$_id', productTitle: '$title', productVariation: '$variation', barcode: '$barcodes' }}]) 这就是我到目前为止一直在尝试的。它返回聚合,但包含空值: U
db.product.aggregate([
{$unwind: '$barcodes'},
{$project: {
_id: 0,
productId: '$_id',
productTitle: '$title',
productVariation: '$variation',
barcode: '$barcodes'
}}])
这就是我到目前为止一直在尝试的。它返回聚合,但包含空值:
UnwindOperation unwindOperation = Aggregation.unwind("barcodes");
ProjectionOperation projectStage = Aggregation.project().and("productId").as("_id").and("productTitle")
.as("title")
.and("productVariation").as("variation")
.and("barcodeTitle").as("barcodes.title")
.and("barcodeValue").as("barcodes.value")
.and("barcodeType").as("barcodes.type")
.and("codeStandard").as("barcodes.codeStandard")
.and("quantity").as("barcodes.quantity")
.and("status").as("barcodes.status");
SortOperation sortOperation = Aggregation.sort(Sort.by(Sort.Direction.DESC, "title"));
Aggregation agg = Aggregation.newAggregation(unwindOperation, projectStage, sortOperation);
AggregationResults<BarcodeAggregateList> results = mongoTemplate.aggregate(agg, "product", BarcodeAggregateList.class);
数据来自的产品类别:
public class Product implements Serializable {
private static final long serialVersionUID = -998149317494604215L;
private String id;
private String title;
private String description;
private String SKU;
private double cost;
private double retailPrice;
private String status;
private LocalDate launchDate;
private LocalDate discontinueDate;
private String discontinueReason;
private String salesChannel;
private List<Barcode> barcodes;
private ProductVariation variation;
private List<Supplier> supplier;
private Product parentProduct;
private boolean updateChildren;
private Label label;
private int secondaryStockLevel;
private int primaryStockLevel;
private Date createdDate;
private Date modifiedDate;
private List<Dimension> dimensions;
private boolean isDeleted = false;
}
我感谢您在这方面提供的任何帮助或资源,以帮助我更好地理解如何执行这些类型的转换
对于任何试图解决类似问题的人,我发现以下资源有些帮助:
BarcodeAggregateList
类字段为null
,因为ProjectionOperation
的and()和as()方法中存在一个小问题。正确的语法是
Aggregation.project().and(SOURCE_FIELD).as(TARGET_FIELD)
您将和(“productId”)写为(“\u id”)
,这是错误的
您需要将其写成和(“\u id”).as(“productId”)
,因为源字段是\u id
完整代码:
UnwindOperation unwindOperation = Aggregation.unwind("barcodes");
ProjectionOperation projectStage = Aggregation.project()
.and("_id").as("productId")
.and("title").as("productTitle")
.and("variation").as("productVariation")
.and("barcodes.title").as("barcodeTitle")
.and("barcodes.value").as("barcodeValue")
.and("barcodes.type").as("barcodeType")
.and("barcodes.codeStandard").as("codeStandard")
.and("barcodes.quantity").as("quantity")
.and("barcodes.status").as("status");
SortOperation sortOperation = Aggregation.sort(Sort.by(Sort.Direction.DESC, "productTitle"));
Aggregation agg = Aggregation.newAggregation(unwindOperation, projectStage, sortOperation);
AggregationResults<BarcodeAggregateList> results = mongoTemplate.aggregate(agg, "product", BarcodeAggregateList.class);
解除操作解除操作=聚合。解除(“条形码”);
ProjectOnOperation projectStage=Aggregation.project()
和(“_id”)。作为(“productId”)
和(“所有权”)。作为(“产品所有权”)
和(“变更”)。作为(“产品变更”)
和(“条形码名称”)。作为(“条形码名称”)
和(“条形码价值”)。作为(“条形码价值”)
和(“条形码类型”)。作为(“条形码类型”)
和(“条形码.代码标准”)。作为(“代码标准”)
.和(“条形码.数量”)作为(“数量”)
和(“条形码状态”)。作为(“状态”);
sortoOperation sortoOperation=Aggregation.sort(sort.by(sort.Direction.DESC,“productTitle”);
Aggregation agg=Aggregation.newAggregation(取消操作、项目阶段、排序操作);
AggregationResults=mongoTemplate.aggregate(agg,“product”,BarcodeAggregateList.class);
您的代码是否正常工作?当前不正常。它不会抛出错误,但只返回null而不是值。您可以发布您的产品classI吗?我更新了此帖子以包含产品和条形码类。感谢您的帮助!这些变化如预期般奏效。我只是误解了Spring Data网站上的文档,并把事情颠倒过来了。
Aggregation.project().and(SOURCE_FIELD).as(TARGET_FIELD)
UnwindOperation unwindOperation = Aggregation.unwind("barcodes");
ProjectionOperation projectStage = Aggregation.project()
.and("_id").as("productId")
.and("title").as("productTitle")
.and("variation").as("productVariation")
.and("barcodes.title").as("barcodeTitle")
.and("barcodes.value").as("barcodeValue")
.and("barcodes.type").as("barcodeType")
.and("barcodes.codeStandard").as("codeStandard")
.and("barcodes.quantity").as("quantity")
.and("barcodes.status").as("status");
SortOperation sortOperation = Aggregation.sort(Sort.by(Sort.Direction.DESC, "productTitle"));
Aggregation agg = Aggregation.newAggregation(unwindOperation, projectStage, sortOperation);
AggregationResults<BarcodeAggregateList> results = mongoTemplate.aggregate(agg, "product", BarcodeAggregateList.class);