Mongodb统计分组后出现列的记录数

Mongodb统计分组后出现列的记录数,mongodb,aggregation-framework,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} }} ]);

我收集了一组如下所示的记录:

{'customer':'unique_value',
 'Date trial':'12/1/2013',
 'Date success':'12/3/2013'}
日期成功字段并不存在于所有记录中,只有存在成功的记录才具有成功字段。每个独特的客户可能有几十次或数百次试用。我想得到一份客户名单、试用次数和成功次数

db.collection.aggregate([ {$group:{_id:'$account',attempts:{$sum:1} }} ]);
将给我每个客户的试用次数,但我不会想出一种方法来同时获得该客户的记录数量,其中存在Date success字段

有什么想法吗?

好问题

您可以使用一些条件运算符来计算字段。下面是与

让我们把它分解一下,即使简短,它仍然是一口

因此,当我们用([“$trial”,0])测试一个字段时,基本上是说如果该字段不存在,那么返回一个
0
,它将被解释为
false
字段
值在逻辑上当然是
true

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

最后在本文中,我们在现场实现了操作符。并且在给我们一个<代码> 1代码>代码的情况下,在<代码> false 情况下,有一个<代码>真的<代码> >条件,或者< <代码> 0 >代码>,那么我们可以考虑<强> >和>强。
同样的原则也适用于。您正在对输出文档进行整形,使其具有两个字段,无论它们是否存在于源中。分配给该字段的值取决于它是否存在。在本例中,0不存在,1存在。然后总结一下结果。

我必须非常仔细地阅读文档,把你的答案拆开,并弄清楚它是如何工作的。因此,$ifNull将检查$trial是否存在,并将返回零或该列的值。返回的值为零或不为零,$cond将计算为true或false,从而返回1或零。然后加上$sum。我明白了吗?非常好的解决方案,谢谢。@KevinThompson差不多就是这样。我是不是太油嘴滑舌了?也许应该更好地解释这一点,但我已经做了一些。很高兴你拿到了。@KevinThompson我想我可能有点矮。希望编辑的内容更容易接受。你的支持票总是很受欢迎的;)。如前所述,这是一个很好的问题,人们经常会忽略这个概念。我不认为你是个矮子或油嘴滑舌的人。我感谢你的帮助。
db.collection.aggregate([
    {$group: { _id: "$account",
        trial:   {$sum: {$cond: [ {$ifNull: ["$trial",0]}, 1, 0]}},
        success: {$sum: {$cond: [ {$ifNull: ["$success",0]}, 1, 0]}}
    }}
])