如何在mongodb的条件语句中使用元素匹配?

How to use element match inside condition statement of mongodb?

我有两个订单

订单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 的状态。

谁能解释一下我们如何才能做到这一点????

你试过这个吗...

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

$elemMatch只适用于match阶段。对于任何其他阶段,您必须使用 ArrayOperators。您可以使用 $in 数组运算符。

正在将您的条件转换为在运算符中使用(使用 java 代码)

AggregationExpression collectionPriceCondition = ConditionalOperators.
                      when(ArrayOperators.arrayOf("tasks.status").containsValue("FAILED")).
                      then(0.0).
                      otherwiseValueOf("cash");