使用mongo一次获取多个项目的最后一条记录

时间:2014-06-16 09:27:38

标签: mongodb aggregation-framework

在我的mongo数据库中,我基本上有2个集合:

  • 学生

    {_id: ObjectID(539ab7ffefbb93120c9697f7), firstname: 'Arnold', lastname: 'Smith'}  
    {_id: ObjectID(539ab7ffefbb93120c5473c3), firstname: 'Steven', lastname: 'Jens'}
    
  • 标记

    { date: '2014-06-12', value: 12, pupilID: 539ab7ffefbb93120c9697f7}  
    { date: '2014-06-05', value: 9, pupilID: 539ab7ffefbb93120c9697f7}  
    { date: '2014-05-10', value: 17, pupilID: 539ab7ffefbb93120c9697f7}  
    { date: '2014-05-10', value: 7, pupilID: 539ab7ffefbb93120c5473c3}
    

有没有办法让mongoshell获得每个学生的最后一个标记,而不必手动循环学生列表并获得每个学生的最后一个标记?

目前,我会遍历每个学生并执行:

db.marks.find({pupilID: pupilID}).sort({_id: -1}).limit(1)

但是如果标记集合包含大量项目,我会非常关注这些表现。

1 个答案:

答案 0 :(得分:1)

那么你的日期不是最好的例子,因为它们是字符串。您应该将它们转换为正确的“日期”类型,但至少它们是排序的词汇。

不是您似乎隐含寻找的“加入”,但您可以从“标记”集合中获取每个学生的$last标记,这可能会对您的结果有所帮助:

db.marks.aggregate([
    { "$sort": { "date": 1 } },
    { "$group": {
        "_id": "$pupilID",
        "date": { "$last": "$date" },
        "value": { "$last": "$value" }
    }}
]}

这将为每个“pupilID”按日期提供最后一个标记“值”。数据的加入取决于你,但这比循环整个集合或以其他方式对每个“pupil”的查询开火更好。