我正在尝试将Mongo的聚合框架与子集一起使用,我已经查看了该项目的测试:
https://github.com/osinka/subset/blob/master/src/test/scala/aggregation/pipelinesSpec.scala
文档中的示例:
http://osinka.github.io/subset/Examples.html
但是仍然不知道如何从TraversableOnce到实际的查询,这就是我一直在尝试的。
正在运行的mongo查询:
db.products.aggregate(
{$unwind: "$c_ids"},
{$match:{c_ids:{$in: [
ObjectId("51e463ba2b3a972d7300091f"),
ObjectId("51cd8dbe2b3a977368000024"),
ObjectId("51e70d052b3a974795000452"),
ObjectId("51cda94f2b3a97739a000025")
]}}},
{$group:{_id:"$c_ids",total:{$sum:1},sale:{$sum:{
$cond: [{$eq: ["$on_sale",true]},1,0]
}}}})
以上工作如预期,这就是我目前所了解的:
val cId = "c_ids".fieldOf[ObjectId]
val total = "total".fieldOf[Int]
val sale = "sale".fieldOf[Int]
val on_sale = "on_sale".fieldOf[Boolean]
val query = db("products").aggregate(
Unwind(cId),
Match(cId in List[ObjectId](new ObjectId("51cda94f2b3a97739a000025"))),
Group(cId,
total -> Group.Sum(1),
sale -> Group.Sum(Project.Cond(Project.Eq(on_sale, true), 1, 2)))
)
上面编译了所有内容,但我不明白接下来会发生什么。。。我以前从未使用过子集。。。一个正确的线索或提示将是伟大的。
Subset没有提供对MongoDB执行查询的方法唯一关心的是MongoJava驱动程序的方法参数,包括文档及其字段。
因此,一旦构建了聚合查询——现在可以运行它了,val query
应该是AggregationOutput结果——您可以调用results()
来获得实际的聚合结果。
有关更多信息,请参阅将聚合框架与java驱动程序一起使用。