【问题标题】:Aggregating/Filtering Mongo Results聚合/过滤 Mongo 结果
【发布时间】:2017-06-24 17:26:08
【问题描述】:

我有一个集合markets 充满了投注市场。我在集合中的数据如下所示:

{ "team" : "Milan", "back" : 1.0, "lay" : 1.0, "btotal" : 7.0, "ltotal" : 6.0 },
{ "team" : "Chelsea", "back" : 1.0, "lay" : 1.0, "btotal" : 1.0, "ltotal" : 1.0 },    
{ "team" : "Arsenal", "back" : 1.0, "lay" : 1.0, "btotal" : 1.0, "ltotal" : 1.0 },
{ "team" : "Milan", "back" : 3.0, "lay" : 3.0, "btotal" : 1.0, "ltotal" : 18.0 }

我想将我的数据显示为唯一名称列表、该行中最高的btotal 和对应的back 赔率、最高的ltotal 及其对应的lay 赔率。 从上面的例子中,返回的数据应该是这样的:

{"team":"Milan", "back":1.0, "lay":3.0, "btotal":7.0, "ltotal":18.0},
{"team":"Chelsea", "back":1.0, "lay":1.0, "btotal":1.0, "ltotal":1.0},    
{"team":"Arsenal", "back":1.0, "lay":1.0, "btotal":1.0, "ltotal":1.0}

这是输出,因为"team":"Milan" 第一次出现时的btotal 大于第二次出现,因此back 的赔率随之返回,@987654332 第二次出现时的ltotal @ 高于第一个,因此返回该行中的 lay 赔率。

任何关于如何在 Mongo 或 Mongoose 中构造此查询的想法都将不胜感激。

【问题讨论】:

    标签: mongodb mongoose mongodb-query


    【解决方案1】:

    你可以使用 mapReduce 吗?

    地图功能

    var map = function() {
        emit(this.team, this);
    }
    

    还有reduce函数:

    var reduce = function(key, values) {
        var res = values[0];
        for (var i = 1; i < values.length; i++) {
                if (values[i].btotal > res.btotal) {
                        res.back = values[i].back;
                        res.btotal = values[i].btotal;
                }
                if (values[i].ltotal > res.ltotal) {
                        res.lay = values[i].lay;
                        res.ltotal = values[i].ltotal;
                }
        }
        return res;
    }
    

    执行map-reduce操作:

    db.markets.mapReduce(map, reduce, {out: "mpmarkets"});
    

    使用 $project(聚合)产生预期的输出:

    cursor = db.mpmarkets.aggregate([{
        $project: {_id:0, 
        team: "$_id", 
        back: "$value.back",
        lay: "$value.lay",
        btotal: "$value.btotal",
        ltotal: "$value.ltotal"} },
        {$sort: {team: -1}
    }]);
    

    打印结果:

    while ( cursor.hasNext() ) {
        printjson( cursor.next() );
    }
    

    结果:

    { "team" : "Milan", "back" : 1, "lay" : 3, "btotal" : 7, "ltotal" : 18 }
    { "team" : "Chelsea", "back" : 1, "lay" : 1, "btotal" : 1, "ltotal" : 1 }
    { "team" : "Arsenal", "back" : 1, "lay" : 1, "btotal" : 1, "ltotal" : 1 }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 2015-10-06
      • 2020-09-05
      • 2020-01-30
      • 1970-01-01
      • 2016-10-02
      • 2021-02-24
      相关资源
      最近更新 更多