首页 > 解决方案 > 将 mongo 聚合查询转换为 kotlin

问题描述

我有以下 mongodb 查询,需要将其转换为 kotlin spring 数据。任何人都可以帮助我:

db.getCollection('activities').aggregate([{
    $project: {
        day: 1,
        rateQuotes: { $cond: { if: { $isArray: "$rateQuotes" }, then: { $size: "$rateQuotes" }, else: 0 } }    
    }
}])

当“rateQuotes”是一个数组时,以下代码将起作用:

val aggregation = newAggregation(
     project("day")
     .and("rateQuotes").size().`as`("rateQuotes")
     )

需要添加条件来处理空值,我认为应该是:

val cond = ConditionalOperators.Cond.***
val aggregation = newAggregation(
     project("day")         
     .and("rateQuotes").applyCondition(cond).size().`as`("rateQuotes")
)

但是我很难创造条件和应用条件。不确定尺寸是否应包含在条件中。如果哪位有这方面的经验,请告诉我,谢谢!

标签: mongodbkotlin

解决方案


我想通了,想在这里分享答案,以防以后有人想做同样的事情:

val rateQuoteConDoc = org.bson.Document("\$isArray", "\$rateQuotes")
val rateQuotesCondition = ConditionalOperators.Cond.`when`{ rateQuoteConDoc }
    .thenValueOf { org.bson.Document("\$size", "\$rateQuotes") }
    .otherwise(0)

val allShipmentsConDoc = org.bson.Document("\$isArray", "\$allShipments.shipments")
val allShipmentsCondition = ConditionalOperators.Cond.`when`{ allShipmentsConDoc }
    .thenValueOf { org.bson.Document("\$size", "\$allShipments.shipments")}
    .otherwise(0)

val match = match(Criteria.where(dayField).gte(startDate).and("type").`is`(type))

val aggregation = newAggregation(
    match,
    project("day")
        .and(rateQuotesCondition).`as`("rateQuotes")
        .and(allShipmentsCondition).`as`("allShipments")
)

谢谢!


推荐阅读