Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python mongodb如何从集合中获取一个字段中具有最大值的所有文档_Python_Python 3.x_Mongodb_Find_Aggregate - Fatal编程技术网

Python mongodb如何从集合中获取一个字段中具有最大值的所有文档

Python mongodb如何从集合中获取一个字段中具有最大值的所有文档,python,python-3.x,mongodb,find,aggregate,Python,Python 3.x,Mongodb,Find,Aggregate,我收集了我所有的自行车历史 每个文档包含类型、开始日期、开始时间、平均速度、平均功率、平均心率。 我需要使用type=“road”获取记录,包括具有最高平均功率的所有字段 我找到了两种方法 一个聚合–匹配(选择道路)、排序和限制1 第一次聚合–匹配(选择道路),使用组获取最大功率 第二次聚合以查找平均功率=最大功率的文档 这两种方法都工作正常,但它们工作得太多了 第一种方法是对所有文档进行排序,以找到最大值 第二种方法是创建两个聚合 最好的方法是什么?这应该行得通。鉴于: var r = [

我收集了我所有的自行车历史 每个文档包含类型、开始日期、开始时间、平均速度、平均功率、平均心率。 我需要使用type=“road”获取记录,包括具有最高平均功率的所有字段 我找到了两种方法

  • 一个聚合–匹配(选择道路)、排序和限制1
  • 第一次聚合–匹配(选择道路),使用组获取最大功率 第二次聚合以查找平均功率=最大功率的文档
  • 这两种方法都工作正常,但它们工作得太多了 第一种方法是对所有文档进行排序,以找到最大值 第二种方法是创建两个聚合


    最好的方法是什么?

    这应该行得通。鉴于:

    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" ]}
            }}
        }}
      ]);