MongoDB noob here ...
当我在shell中执行db.students.find()。pretty()时,我从我的集合中得到一个很长的列表...就像这样...
{
"_id" : 19,
"name" : "Gisela Levin",
"scores" : [
{
"type" : "exam",
"score" : 44.51211101958831
},
{
"type" : "quiz",
"score" : 0.6578497966368002
},
{
"type" : "homework",
"score" : 93.36341655949683
},
{
"type" : "homework",
"score" : 49.43132782777443
}
]
}
现在我已经有超过100个......我需要在每个上面运行以下内容......
lowest_hw_score =
db.students.aggregate(
// Initial document match (uses index, if a suitable one is available)
{ $match: {
_id : 0
}},
// Expand the scores array into a stream of documents
{ $unwind: '$scores' },
// Filter to 'homework' scores
{ $match: {
'scores.type': 'homework'
}},
// Sort in descending order
{ $sort: {
'scores.score': 1
}},
{ $limit: 1}
)
所以我可以在每个结果上运行这样的东西
for item in lowest_hw_score:
print lowest_hw_score
现在“lower_score”仅适用于我在集合中的所有项目上运行此项目的一个项目...我该怎么做?
答案 0 :(得分:0)
> db.students.aggregate(
{ $match : { 'scores.type': 'homework' } },
{ $unwind: "$scores" },
{ $match:{"scores.type":"homework"} },
{ $group: {
_id : "$_id",
maxScore : { $max : "$scores.score"},
minScore: { $min:"$scores.score"}
}
});
你真的不需要第一个$匹配,但是如果“scores.type”被索引,则意味着它将在展开分数之前使用。 (我不相信$ unwind mongo能够使用索引。)
结果:
{
"result" : [
{
"_id" : 19,
"maxScore" : 93.36341655949683,
"minScore" : 49.43132782777443
}
],
"ok" : 1
}
编辑:在mongo shell中测试和更新