【发布时间】:2023-04-11 11:36:01
【问题描述】:
我有以下数据结构:
{
"_superBill": {
"$oid": "568b250ba082dfc752b20021"
},
"paymentProviderTxID": "aaaa",
"transactionRaw": "abcdef",
"commissionRate": 0.2,
"visitDate": {
"$date": "2016-12-26T13:04:05.544Z"
}
},
{
"_superBill": {
"$oid": "568b250ba082dfc752b20021"
},
"paymentProviderTxID": "bbbb",
"transactionRaw": "abcdef",
"commissionRate": 0.2,
"visitDate": {
"$date": "2016-12-26T13:04:05.544Z"
}
},
{
"_superBill": null,
"paymentProviderTxID": "cccc",
"transactionRaw": "abcdef",
"commissionRate": 0.2,
"visitDate": {
"$date": "2016-12-27T13:04:05.544Z"
}
},
{
"_superBill": null,
"paymentProviderTxID": "dddd",
"transactionRaw": "abcdef",
"commissionRate": 0.2,
"visitDate": {
"$date": "2016-12-28T13:04:05.544Z"
}
}
我有一个按引用的 _superBill 字段分组的聚合函数。在我遇到 _superBill 具有 null 值的条目并将它们全部归为一个之前,它的效果很好。
有没有一种方法可以只对具有有效 _superBill 的条目进行分组,同时仍包含具有“null”的值,以便我可以在一个查询中执行此操作并按 visitDate 对它们进行排序?
聚合函数:
Transaction.aggregate([
{ $match: { paymentDate: { $gte: period.periodStart, $lt: period.periodEnd }} },
{
$group: {
_id: "$_superBill",
visits: { $sum: 1 }
}
},
{
$project: {
_id: '$_id',
superBill: '$_id',
visits: '$visits',
visitDate: '$visitDate',
commissionRate: '$commissionRate'
}
}
], function(err,results) {
// Process results
});
结果集如下所示。请注意,前 2 个已分组,因为它们具有相同的 _superBill _id,而其他两个未分组。
{
"_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"
}
}
感谢您的关注并感谢任何帮助。
【问题讨论】:
-
谢谢@chridam。我查看了 $ifNull 运算符,看起来我可以向空字段添加默认值。抱歉,如果我没有正确理解这一点,但这只会为其分组分配相同的值,除非 $ifNull 可以递增或随机化。我也不确定 $first 运算符如何与 $ifNull 结合使用。
标签: mongodb mongoose mongodb-query aggregation-framework