Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将MongoDB查询转换为Spring数据查询_Java_Spring_Mongodb_Spring Data_Spring Mongodb - Fatal编程技术网

Java 如何将MongoDB查询转换为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

我正在尝试转换以下Mongo查询以用于Spring数据

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);