Python mongodb如何从集合中获取一个字段中具有最大值的所有文档
我收集了我所有的自行车历史 每个文档包含类型、开始日期、开始时间、平均速度、平均功率、平均心率。 我需要使用type=“road”获取记录,包括具有最高平均功率的所有字段 我找到了两种方法Python mongodb如何从集合中获取一个字段中具有最大值的所有文档,python,python-3.x,mongodb,find,aggregate,Python,Python 3.x,Mongodb,Find,Aggregate,我收集了我所有的自行车历史 每个文档包含类型、开始日期、开始时间、平均速度、平均功率、平均心率。 我需要使用type=“road”获取记录,包括具有最高平均功率的所有字段 我找到了两种方法 一个聚合–匹配(选择道路)、排序和限制1 第一次聚合–匹配(选择道路),使用组获取最大功率 第二次聚合以查找平均功率=最大功率的文档 这两种方法都工作正常,但它们工作得太多了 第一种方法是对所有文档进行排序,以找到最大值 第二种方法是创建两个聚合 最好的方法是什么?这应该行得通。鉴于: var r = [
最好的方法是什么?这应该行得通。鉴于:
var r =
[
{_id:0, road:"A", avgpower: 10, hr: 110},
{_id:7, road:"A", avgpower: 14, hr: 109},
{_id:1, road:"B", avgpower: 12, hr: 140},
{_id:2, road:"B", avgpower: 14, hr: 130},
{_id:3, road:"B", avgpower: 14, hr: 120},
{_id:4, road:"B", avgpower: 10, hr: 117}
];
db.foo.insert(r);
那么这个管道呢,
c = db.foo.aggregate([
// Filter on road and get the highest avg power:
{$match: {road: "B"}}
,{$sort: {avgpower: -1}}
,{$limit: 1}
// Now, do another query against the same collection, filtering
// by road AND the highest avg power:
,{$lookup: {
from: "foo",
let: { mm: "$avgpower", rr: "$road" },
pipeline: [
{$match: {$expr: {$and: [
{$eq: ["$avgpower", "$$mm"] }
,{$eq: ["$road", "$$rr" ]}
]
}}}
],
as: "ZZ"}}
// The lookup will yield an array. If this is not convenient,
// then turn the array into separate docs and make the "ZZ"
// object become the new root:
,{$unwind: "$ZZ"}
,{$replaceRoot: { newRoot: "$ZZ" }}
]);
产生以下输出:
{ "_id" : 2, "road" : "B", "avgpower" : 14, "hr" : 130 }
{ "_id" : 3, "road" : "B", "avgpower" : 14, "hr" : 120 }
这里还有另一种方法:使用$group
创建和排列,然后对其进行过滤。如果需要,您可以像以前一样$unwind
和$replaceRoot
:
db.foo.aggregate([
{$match: {road: "B"}}
,{$group: {_id: null, maxp: {$max: "$avgpower"}, items: {$push: "$$CURRENT"} }}
,{$project: {"X": {$filter: {
input: "$items",
as: "zz",
cond: {$eq:[ "$$zz.avgpower", "$maxp" ]}
}}
}}
]);