簡體   English   中英

如何將 MongoDB 查詢轉換為 Spring 數據查詢

[英]How to Convert MongoDB Query to Spring Data Query

我正在嘗試轉換以下 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);

它返回的是什么:

返回示例

我映射到的類(有 getter/setter):

public class BarcodeAggregateList {
   private String productId;
   private String productTitle;
   private String productVariation;
   private String barcodeTitle;
   private String barcodeValue;
   private String barcodeType;
   private String codeStandard;
   private int quantity;
   private String status;
}

數據來自的產品類別:

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

條碼類

public class Barcode {
    private String type;
    private String title;
    private String value;
    private String status;
    private String codeStandard;
    private int quantity;
}

我感謝任何有關此或資源的幫助,以幫助我更好地了解如何執行這些類型的轉換。

對於任何試圖解決類似問題的人,我發現以下資源有些幫助:

BarcodeAggregateList類字段為null因為ProjectionOperation的 and() 和 as() 方法中存在一個小問題。 正確的語法是

Aggregation.project().and(SOURCE_FIELD).as(TARGET_FIELD)

你寫了and("productId").as("_id") ,這是錯誤的

您需要將其寫為and("_id").as("productId") ,因為源字段是_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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM