我目前正在通过添加一个可以注入而不是MS SQL Server存储库的MongoDB存储库来为我的应用程序添加MongoDB支持。到目前为止,一切进展顺利,大多数查询都很简单,数据库结构很好地迁移(这很简单)。
我有一些总结报告,我现在正在与SQL Server实现相对简单的战斗:
所以我有一张桌子(为简洁起见而简化),说:
[ Runners ]
[RunnerId int]
[DateRun DateTime]
[RaceTime float]
现在我想要一个包含所有参赛者名单和最后一场比赛时间的摘要。请注意,上表中每个跑步者都有多个条目。
在SQL中,这可以通过以下方式实现:
SELECT r.runnerId, r.DateRun, r.RaceTime
FROM (
SELECT runnerId, MAX(DateRun) AS lastRace
FROM Runners GROUP BY runnerId
) AS x INNER JOIN runners AS r ON
r.runnerId = x.runnerId AND
r.DateRun = x.lastRace
我正在使用官方的C#10gen驱动程序。提示和指示欢迎。
答案 0 :(得分:1)
正如前面提到的所有评论一样,这可以使用Aggregation Framework来实现。我把C#留给你,但我将演示一个使用Mongo shell的简单例子。
从以下示例数据开始。
> db.runners.find()
{ "_id" : ObjectId("50b3ec3c9dc68d628bd11869"), "name" : "a", "d" : ISODate("2012-10-29T00:00:00Z"), "time" : 10.3 }
{ "_id" : ObjectId("50b3ec429dc68d628bd1186a"), "name" : "a", "d" : ISODate("2012-10-20T00:00:00Z"), "time" : 12.3 }
{ "_id" : ObjectId("50b3ec549dc68d628bd1186b"), "name" : "b", "d" : ISODate("2012-10-29T00:00:00Z"), "time" : 11.45 }
{ "_id" : ObjectId("50b3ec5a9dc68d628bd1186c"), "name" : "b", "d" : ISODate("2012-10-25T00:00:00Z"), "time" : 11 }
{ "_id" : ObjectId("50b3ec6a9dc68d628bd1186d"), "name" : "c", "d" : ISODate("2012-10-25T00:00:00Z"), "time" : 10.8 }
{ "_id" : ObjectId("50b3f1249dc68d628bd1186e"), "name" : "b", "d" : ISODate("2012-11-13T00:00:00Z"), "time" : 23.2 }
然后,以下聚合查询返回:
> db.runners.aggregate({$sort:{name:1,d:-1}},{$group:{_id:"$name",d:{$first:"$d"},time:{$first:"$time"}}})
{
"result" : [
{
"_id" : "c",
"d" : ISODate("2012-10-25T00:00:00Z"),
"time" : 10.8
},
{
"_id" : "b",
"d" : ISODate("2012-11-13T00:00:00Z"),
"time" : 23.2
},
{
"_id" : "a",
"d" : ISODate("2012-10-29T00:00:00Z"),
"time" : 10.3
}
],
"ok" : 1
}
首先,$sort
运算符按runners
排序name
,然后按降序排序d
,因此每个转轮名称的第一个文档应该是最近的运行日期为每个跑步者。然后,$group
运算符为每个运行程序提取第一个文档,以及该比赛的最新运行日期和运行时。