我有两个订单
订单A:
{
"_id": "5e0092e725473011f4b4da54",
"cash": 400.0,
"deliveryFee": 5.0,
"paymentOnPickUp" : false,
"project": {
"_id": "5dd3b4737908cb0cf7b40f84",
"name": "Default Instant Deliveries"
},
"tasks": [{
"tripType": "PICKUP",
"status": "UNASSIGNED"
},
{
"tripType": "DELIVERY",
"status": "UNASSIGNED"
}
]
}订单B:
{
"_id": "5e0092e725473011f4b4da54",
"cash": 250.0,
"deliveryFee": 15.0,
"paymentOnPickUp" : true,
"project": {
"_id": "5dd3b4737908cb0cf7b40f84",
"name": "Default Instant Deliveries"
},
"tasks": [{
"tripType": "PICKUP",
"status": "FAILED"
},
{
"tripType": "DELIVERY",
"status": "UNASSIGNED"
}
]
}现在我必须获得基于项目的聚合信息。但我只需要添加现金,如果在pickUp上的任务没有失败。
订单A的现金收款为400,订单B的收款为800,订单B的提货任务失败。所以我们不需要加现金,但要加运费。
| Project | Cash | Delivery Fee | total Orders |
|----------------------------|------|--------------|--------------|
| Default Instant Deliveries | 400 | 20 | 2 |下面是我尝试过的事情
fun getProjectsSummary(): MutableList<OrderSummaryDto> {
val collectionPriceCondition = ConditionalOperators.`when`(where("tasks")
.elemMatch(where("status").`is`("FAILED"))).then(0.0).otherwiseValueOf("cash")
val agg = Aggregation.newAggregation(
Aggregation.project()
.and("cashCollection").applyCondition(collectionPriceCondition),
Aggregation.group("project.id")
.sum("deliveryFee").`as`("totalDeliveryPrice")
.sum("cashCollection").`as`("totalCashCollection")
.first("project.name").`as`("projectName")
.count().`as`("totalOrders")
)
return mongoTemplate
.aggregate(agg, "ordersCollection", OrderSummaryDto::class.java).mappedResults
}但是我的身体状况不好,不能使用elematch。
谁能解释一下我们如何实现这一点?
发布于 2019-12-31 02:09:23
$elemMatch仅适用于match阶段。对于任何其他阶段,您必须使用ArrayOperators。您可以使用$in数组运算符。
将条件转换为在运算符中使用(使用java代码)
AggregationExpression collectionPriceCondition = ConditionalOperators.
when(ArrayOperators.arrayOf("tasks.status").containsValue("FAILED")).
then(0.0).
otherwiseValueOf("cash");发布于 2019-12-30 14:19:46
你试过这个吗..。
List<Criteria> criteriaList = new ArrayList<>();
criteriaList.add(where("tasks.status").`is`("FAILED"));
criteriaList.add(where("tasks.status").`nin`("COMPLETED"));
val collectionPriceCondition = ConditionalOperators.`when`(new Criteria().andOperator(criteriaList.toArray(new Criteria[criteriaList.size()])))).then(0.0).otherwiseValueOf("cash")https://stackoverflow.com/questions/59484792
复制相似问题