【问题标题】:How to use aggregate with ReactiveMongo如何在 ReactiveMongo 中使用聚合
【发布时间】:2016-07-01 01:57:55
【问题描述】:

因此,我需要按对象数组中的字段对 MongoDB 上的集合进行排序。

我有

"columns": [{
    "kind": "FirstKind",
    "descriptor": "Description1",
    "data": "Data to be sorted"
},{
    "kind": "SecondKind",
    "descriptor": "Description2",
    "data": "Data to be sorted"
}]

我想要实现的是选择“FirstKind”“Description1”或“SecondKind”“Description2”并按字段数据对集合进行排序。我在 MongoDB 上找到了一个解决方案,方法是:

db.getCollection('results').aggregate(
    [{ 
        "$match": { 
           "$and": [{
               "columns.kind": "FirstKind"
            }, {
               "columns.descriptor": "Name" 
            }] 
        } 
    },{ 
        "$sort": { 
           "columns.data": -1 
         } 
    },{ 
        "$limit": 20 
    }]
)

我现在的问题是如何将它翻译成 Scala 上的 ReactiveMongo。我一直在尝试理解这个文档:http://reactivemongo.org/releases/0.11/documentation/advanced-topics/aggregation.html 但我真的很困惑。有没有人在 Scala 上使用过聚合和 ReactiveMongo ?谢谢!

【问题讨论】:

    标签: mongodb scala playframework reactivemongo play-reactivemongo


    【解决方案1】:

    我同意,这不是 ReactiveMongo 中最直接的东西。

    我已尝试将您的代码翻译成下面的 ReactiveMongo 聚合查询语法。但是我还没有运行它,所以你可能需要稍微调整一下。

    val dao = reactiveMongoApi.db.collection[BSONCollection]("results")
    import dao.BatchCommands.AggregationFramework._
    
    dao.aggregate(
      Match(BSONDocument(
        "columns.kind" -> "FirstKind",
        "columns.descriptor" -> "Name")),
      List(
        Sort(Descending("limit")),
        Limit(20)))
    

    【讨论】:

    • 所以,如果是find,您可以使用.cursor[CaseClass](),然后应用收集或您需要对对象执行的任何其他操作。你怎么用aggregate做类似的事情,因为它似乎没有cursor
    • 你应该看看API reference
    • 我们做了,但没有多大意义
    • 有意义的是,如果以这种方式执行聚合,则可以从AggregationResult 使用Cursor
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    相关资源
    最近更新 更多