Mongodb计算分组后列所在的数字记录

时间:2014-02-20 05:48:37

标签: mongodb aggregation-framework

我有一组看起来像这样的记录:

{'customer':'unique_value',
 'Date trial':'12/1/2013',
 'Date success':'12/3/2013'}

日期成功字段不存在于每条记录中,只有成功的记录才有成功字段。每个独特的客户可能有数十或数百个试验。我想得到一份客户名单,试验次数和成功次数

db.collection.aggregate([ {$group:{_id:'$account',attempts:{$sum:1} }} ]);

会给我每个客户的试验次数,但是我没有想出一个方法来获得该日期成功字段所在的客户的记录数量。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

好问题。

您可以使用一些条件运算符来评估字段。以下是将$cond$ifNull

结合使用的用法
db.collection.aggregate([
    {$group: { _id: "$account",
        trial:   {$sum: {$cond: [ {$ifNull: ["$trial",0]}, 1, 0]}},
        success: {$sum: {$cond: [ {$ifNull: ["$success",0]}, 1, 0]}}
    }}
])

让我们打破这一点,即使简短,它仍然是一口。

因此,当我们使用$ifNull([“$ trial”,0])测试某个字段时,它基本上是说如果字段存在,则返回{{1} }将被解释为0false值当然是逻辑field

然后我们问$cond(这是一种三元),给定这个条件(这将是结果:true或false)然后返回 true false 值,作为额外参数。

最后在$group我们在该字段上实施$sum运算符。由于$cond给了我们一个true 1条件,或true案例0,我们可以考虑总和 元素所在的匹配条件的结果与您的查询预期一致。

同样的原则适用于$project。您正在调整输出文档以使其具有两个字段,无论它们是否存在于源中。分配给字段的值取决于是否存在。在这种情况下,0表示它不在那里,1表示它在哪里。然后只是总结结果。