【问题标题】:sum number of occurrences on two fields in mongodbmongodb中两个字段的出现次数总和
【发布时间】:2016-10-04 07:25:58
【问题描述】:

我有一个名为游戏的文档集合,看起来像这样

{ winner: 'oakis', loser: 'test' },
{ winner: 'test', loser: 'oakis' }

现在我想让 MongoDB 输出这个:

{ _id: 'oakis', wins: 1, losses: 1 },
{ _id: 'test', wins: 1, losses: 1 }

我一直在研究聚合、mapReduce 和 distinct,但没有成功。 我希望你能帮助我!

编辑:

我有一个名为“tied”的字段,它也是一个布尔值。我怎样才能在结果中实现平局? (游戏中每个玩家还有一个字段,player1 & player2) 结果应该是: { _id: 'name', wins: 3, losses: 1, tied: 1 }

EDIT2:

这样解决了!

db.games.aggregate([
    { 
        $project: { 
            scores: [
                { name: '$winner', wins: { $literal: 1 }, losses: { $literal: 0 }, tied: { $literal: 0 } }, 
                { name: '$loser', wins: { $literal: 0 }, losses: { $literal: 1 }, tied: { $literal: 0 } },
        { name: '$player1', wins: { $literal: 0 }, losses: { $literal: 0 }, tied: { $cond: [ "$tied", 1, 0 ] } },
        { name: '$player2', wins: { $literal: 0 }, losses: { $literal: 0 }, tied: { $cond: [ "$tied", 1, 0 ] } }
            ] 
        } 
    }, 
    { 
        $unwind: '$scores' 
    }, 
    { 
        $group: {
             _id: "$scores.name", 
            wins: { $sum: "$scores.wins" }, 
            losses: { $sum: "$scores.losses" },
    tied: { $sum: "$scores.tied" }
        } 
    }
])

【问题讨论】:

    标签: mongodb mongoose mongodb-aggregation


    【解决方案1】:

    通过聚合框架,您可以使用如下所示的管道。本质上,它首先将数据投影到 [{name: $winner, wins: 1, losses: 0}, {name: $loser, wins: 0, losses: 1}] 形式的 2 元素数组中,然后展开数组以生成单元素数组,然后按名称分组,并总结胜负。

    games.aggregate(
        [
            { 
                $project: { 
                    scores: [
                        { name: '$winner', wins: { $literal: 1 }, losses: { $literal: 0 } }, 
                        { name: '$loser', wins: { $literal: 0 }, losses: { $literal: 1 } }
                    ] 
                } 
            }, 
            { 
                $unwind: '$scores' 
            }, 
            { 
                $group: {
                     _id: "$scores.name", 
                    wins: { $sum: "$scores.wins" }, 
                    losses: { $sum: "$scores.losses" } 
                } 
            }
        ]
    )
    

    【讨论】:

    • 我有一个名为“tied”的字段,它也是一个布尔值。我怎样才能在结果中实现平局? (游戏中每个玩家还有一个字段,player1 & player2)结果应该是:{ _id: 'name', wins: 3, losses, 1, tied: 1 }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多