2016-06-16 5 views
0

Я делаю простое тестовое приложение для изучения возможностей Морфий. На данный момент я пытаюсь сделать простой запрос агрегирования на SaleStatistics. Запрос: Фильтр по описанию продукта и группировке по семейству продуктов и подсемействам и количеству и сумме суммы. Проблема заключается в том, что, хотя Morphia выполняла правильную замену имен свойств на фазе $ match в соответствии с сопоставлениями @Property, определенными в классах, она не выполняла такую ​​же замену в фазе $ group. В этом случае непосредственно, используя строки свойств, используемых в определении агрегации, как вы можете видеть в этом коде отрезала от лесозаготовительной консоли:Почему Morphia не использует значение @Property в агрегации?

2016-06-16 10:09:22 DEBUG AggregationPipelineImpl:36 - stages = [{ "$match" : { "Producto.Denominacion" : "MAGNA"}}, { "$group" : { "_id" : { "productFamily" : "$product.productFamily" , "productSubfamily" : "$product.productSubFamily"} , "saleStatisticsQuantity" : { "$sum" : "$quantity"} , "saleStatisticsAmount" : { "$sum" : "$amount"}}}] 

Вот мой Entity отображение:

@SuppressWarnings("serial") 
@Entity(value="EstadisticaDeVentas", noClassnameStored=true) 
public class SaleStatistics extends FactTableEntity { 

    @Embedded(value="Gasolinera", concreteClass=GasStationEmbedded.class) 
    private GasStationEmbedded gasStation; 

    @Embedded(value="Producto", concreteClass=ProductEmbedded.class) 
    private ProductEmbedded product; 

    @Embedded(value="Cliente", concreteClass=ClientEmbedded.class) 
    private ClientEmbedded client; 

    @Embedded(value="Turno", concreteClass=ShiftEmbedded.class) 
    private ShiftEmbedded shift; 

    @Embedded(value="Responsable", concreteClass=ResponsibleEmbedded.class) 
    private ResponsibleEmbedded responsible; 

    @Embedded(value="Isla", concreteClass=IslandEmbedded.class) 
    private IslandEmbedded island; 

    @Embedded(value="Vehiculo", concreteClass=VehicleEmbedded.class) 
    private VehicleEmbedded vehicle; 

    @Property("Origen") 
    private OriginType originType; 

    @Property("Canal") 
    private Channel channel; 

    @Property("Cantidad") 
    private BigDecimal quantity; 

    @Property("Jarreo") 
    private BigDecimal samplesQuantity; 

    @Property("Precio") 
    private BigDecimal price; 

    @Property("Monto") 
    private BigDecimal amount; 

    @Property("CostoDeVenta") 
    private BigDecimal costAmount; 

    public OriginType getOriginType() { 
     return originType; 
    } 
    public void setOriginType(OriginType originType) { 
     this.originType = originType; 
    } 

    public BigDecimal getQuantity() { 
     return quantity; 
    } 
    public void setQuantity(BigDecimal quantity) { 
     this.quantity = quantity; 
    } 

    public BigDecimal getSamplesQuantity() { 
     return samplesQuantity; 
    } 
    public void setSamplesQuantity(BigDecimal samplesQuantity) { 
     this.samplesQuantity = samplesQuantity; 
    } 

    public BigDecimal getPrice() { 
     return price; 
    } 
    public void setPrice(BigDecimal price) { 
     this.price = price; 
    } 

    public BigDecimal getAmount() { 
     return amount; 
    } 
    public void setAmount(BigDecimal amount) { 
     this.amount = amount; 
    } 


    public BigDecimal getCostAmount() { 
     return costAmount; 
    } 
    public void setCostAmount(BigDecimal costAmount) { 
     this.costAmount = costAmount; 
    } 

    public Channel getChannel() { 
     return channel; 
    } 
    public void setChannel(Channel channel) { 
     this.channel = channel; 
    } 
    public GasStationEmbedded getGasStation() { 
     return gasStation; 
    } 
    public void setGasStation(GasStationEmbedded gasStation) { 
     this.gasStation = gasStation; 
    } 
    public ProductEmbedded getProduct() { 
     return product; 
    } 
    public void setProduct(ProductEmbedded product) { 
     this.product = product; 
    } 
    public ClientEmbedded getClient() { 
     return client; 
    } 
    public void setClient(ClientEmbedded client) { 
     this.client = client; 
    } 
    public ShiftEmbedded getShift() { 
     return shift; 
    } 
    public void setShift(ShiftEmbedded shift) { 
     this.shift = shift; 
    } 
    public ResponsibleEmbedded getResponsible() { 
     return responsible; 
    } 
    public void setResponsible(ResponsibleEmbedded responsible) { 
     this.responsible = responsible; 
    } 
    public IslandEmbedded getIsland() { 
     return island; 
    } 
    public void setIsland(IslandEmbedded island) { 
     this.island = island; 
    } 
    public VehicleEmbedded getVehicle() { 
     return vehicle; 
    } 
    public void setVehicle(VehicleEmbedded vehicle) { 
     this.vehicle = vehicle; 
    } 


} 

И вот мое картографирование продукта:

public class Product { 

    @Property("Codigo") 
    private Integer code; 

    @Property("Denominacion") 
    private String description; 

    @Property("UnidadDeMedida") 
    private String messureUnit; 

    @Property("Departamento") 
    private String store; 

    @Property("Familia") 
    private String productFamily; 

    @Property("SubFamilia") 
    private String productSubFamily; 

    @Property("ClaveProveedor") 
    private String providerCode; 

    public Integer getCode() { 
     return code; 
    } 
    public void setCode(Integer code) { 
     this.code = code; 
    } 

    public String getDescription() { 
     return description; 
    } 
    public void setDescription(String description) { 
     this.description = description; 
    } 

    public String getMessureUnit() { 
     return messureUnit; 
    } 
    public void setMessureUnit(String messureUnit) { 
     this.messureUnit = messureUnit; 
    } 

    public String getStore() { 
     return store; 
    } 
    public void setStore(String store) { 
     this.store = store; 
    } 

    public String getProductFamily() { 
     return productFamily; 
    } 
    public void setProductFamily(String productFamily) { 
     this.productFamily = productFamily; 
    } 

    public String getProductSubFamily() { 
     return productSubFamily; 
    } 
    public void setProductSubFamily(String productSubFamily) { 
     this.productSubFamily = productSubFamily; 
    } 

    protected String getProviderCode() { 
     return providerCode; 
    } 
    protected void setProviderCode(String providerCode) { 
     this.providerCode = providerCode; 
    } 



} 

@Embedded 
public class ProductEmbedded extends Product { 

} 

Я что-то не так?

ответ

0

Форма документа не может быть гарантирована на этом этапе, и поэтому нет реальной модели Java для проверки. Это не так идеально, чтобы быть уверенным, но мы работаем над решением для отслеживания изменения документа/модели с помощью различных этапов трубопровода.

+0

Но если агрегирование было выполнено на SaleStatistics.class и свойства, сгруппированные из встроенного документа, я не понимаю, почему вы не можете. Это делает комбинацию сопоставления и агрегации бесполезной imho –

+0

. $ Group может произойти после $ project, например. и несколько раз в данном конвейере. Просто невозможно гарантировать, что форма документа соответствует любому типу Java в этой точке. – evanchooly

 Смежные вопросы

  • Нет связанных вопросов^_^