在我的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)
但是如果标记集合包含大量项目,我会非常关注这些表现。
答案 0 :(得分:1)
那么你的日期不是最好的例子,因为它们是字符串。您应该将它们转换为正确的“日期”类型,但至少它们是排序的词汇。
不是您似乎隐含寻找的“加入”,但您可以从“标记”集合中获取每个学生的$last
标记,这可能会对您的结果有所帮助:
db.marks.aggregate([
{ "$sort": { "date": 1 } },
{ "$group": {
"_id": "$pupilID",
"date": { "$last": "$date" },
"value": { "$last": "$value" }
}}
]}
这将为每个“pupilID”按日期提供最后一个标记“值”。数据的加入取决于你,但这比循环整个集合或以其他方式对每个“pupil”的查询开火更好。