Próbuję przekonwertować następujące zapytanie Mongo do użytku z danymi sprężynowymi.

db.product.aggregate([
{$unwind: '$barcodes'},
{$project: {
    _id: 0, 
    productId: '$_id',
    productTitle: '$title',
    productVariation: '$variation', 
    barcode: '$barcodes'
}}])

To właśnie próbowałem do tej pory. Zwraca agregację, ale z wartościami NULL:

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

Co to jest powracające:

return example

Klasa, do której mapę (ma Galters / Setters):

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

Klasa produktu, z którego pochodzą dane:

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

Klasa kodów kreskowych.

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

Doceniam jakąkolwiek pomoc w tym lub zasobach, aby pomóc mi lepiej zrozumieć, jak wykonać te typy konwersji.

Dla każdego, kto próbuje rozwiązać podobne problemy, znalazłem nieco następujące zasoby:

1
Kylep5587 21 październik 2020, 20:16

1 odpowiedź

Najlepsza odpowiedź

BarcodeAggregateList Pola klasy są null, ponieważ istnieje niewielki problem w metodach ProjectionOperation's i () i jako () metody. Prawidłowa składnia jest

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

Napisałeś and("productId").as("_id"), co jest złe

Musisz napisać to jako and("_id").as("productId"), ponieważ pole źródła jest _id

pełny kod:

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);
1
Ajit Soman 23 październik 2020, 12:46