MongoDb将$ group'_id'空值聚合为不同

时间:2016-01-06 14:59:21

标签: mongodb mongoose mongodb-query aggregation-framework

我有以下数据结构:

{
    "_superBill": {
        "$oid": "568b250ba082dfc752b20021"
    },
    "visits": 1,
    "commissionRate": 0.2,
    "visitDate": {
        "$date": "2016-12-26T13:04:05.544Z"
    }  
},
{
    "_superBill": null,
    "visits": 1,
    "commissionRate": 0.2,
    "visitDate": {
        "$date": "2016-12-27T13:04:05.544Z"
    }
},
{
    "_superBill": null,
    "visits": 1,
    "commissionRate": 0.2,
    "visitDate": {
        "$date": "2016-12-28T13:04:05.544Z"
    }
}

我有一个聚合函数,按引用的 _superBill 字段进行分组。它运行良好,直到我遇到 _superBill null 值并将它们全部分组为一个。

是否有一种方法可以只对具有有效_superBill的条目进行分组,同时仍然包含具有“null”的值,以便我可以在一个查询中执行此操作并按visitDate对它们进行排序?

聚合功能:

{{1}}

结果集看起来像这样。请注意,前两个是分组的,因为它们具有相同的_superBill _id,而另外两个是未分组的。

{{1}}

感谢您寻求并感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

如果_id等于_superBill,您可以使用null$group您的文档。为此,您可以使用$ifNull运算符。

Transaction.aggregate(
    [ 
        { "$group": { 
             "_id": { "$ifNull": [ "$_superBill", "$_id" ] },  
             "visits": { "$sum": 1 }, 
             "visitDate": { "$first": "$visitDate" },
             "commissionRate": { "$first": "$commissionRate" }, 
             "_superBill": { "$first": "$_superBill" } 
        }}
    ],  function(err,results) {
           // Process results
        }
)

当然,您也可以使用$cond运算符。

"_id": { 
    "$cond": [ 
        { "$eq": [ "$_superBill", null ] }, 
        "$_id", 
        "$_superBill" 
    ] 
}