Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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
mongodb中两个字段出现的总数_Mongodb_Mongoose_Mongodb Aggregation - Fatal编程技术网

mongodb中两个字段出现的总数

mongodb中两个字段出现的总数,mongodb,mongoose,mongodb-aggregation,Mongodb,Mongoose,Mongodb Aggregation,我有一个叫做games的文档集,看起来像这样 { winner: 'oakis', loser: 'test' }, { winner: 'test', loser: 'oakis' } 现在我想让MongoDB输出以下内容: { _id: 'oakis', wins: 1, losses: 1 }, { _id: 'test', wins: 1, losses: 1 } 我一直在研究聚合、mapReduce和distinct,但没有成功。 我希望你能帮助我 编辑: 我有一个名为“tied”

我有一个叫做games的文档集,看起来像这样

{ 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) 结果应该是:
{u id:'name',赢:3,输:1,平:1}

编辑2:

就这样解决了

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

使用聚合框架,您可以使用如下管道。从本质上讲,它首先将数据投影到一个2元素数组中,数组的形式为
[{name:$winner,wins:1,loss:0},{name:$loser,wins:0,loss:1}]
,然后展开数组以生成单个元素数组,然后按名称分组,并对赢和输进行汇总

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”的字段,它也是一个布尔值。如何在结果中实现平局游戏?(游戏中每个玩家都有一个区域,玩家1和玩家2)结果应该是:
{u id:'name',赢:3,输,1,平:1}