Mongodb 使用 facet 时的排序问题
Mongodb sorting issue when using facet
mongodb 排序在使用 facet 和 mongo 聚合时不起作用。使用排序函数后结果未排序。我正在将 utc 日期从 at 转换为日期字符串。
还需要删除每个文档的 _id
请帮我查询一下
使用
输入json有效载荷
{
"_id": {
"$oid": "122434543sdf"
},
"eventName": "ev1",
"channelId": "channel1",
"domain": "domain1",
"lob": "lob1",
"eventCategory": "category1",
"producerCSI": "1234",
"topicName": "topic1",
"dateTime": "2021-12-29T20:04:37Z",
"errorDetailsList": [{
"errorType": "Missing data",
"count": {
"$numberLong": "1"
}
}, {
"errorType": "Invalid Data",
"count": {
"$numberLong": "1"
}
}]
}
]
}
Mongo 我写的查询
db.failureevents.aggregate( [
{$unwind: { "path": "$errorDetailsList", "preserveNullAndEmptyArrays": true} },
{$addFields: {errorType: {$arrayElemAt: [{$objectToArray: "$errorDetailsList"}, 0]}}},
{$addFields: {"errorType": "$errorType.v"}},
{$lookup : { "from": "errordescription", "localField": "errorType", "foreignField": "errorType", "as": "dataset" }},
{$unwind: { "path": "$dataset", "preserveNullAndEmptyArrays": true } },
{$facet: {
"top": [
{ "$group": {
"_id": {
"lob": "$lob",
"channel": "$channelId",
"domain": "$domain",
"eventCategory": "$eventCategory",
"prodcuerCSI": "$producerCSI",
"topicName": "$topicName",
"eventName": "$eventName",
"errorType":"$dataset.errorType",
"errorMessage":"$dataset.errorMessage",
"dateTime":"$dateTime",
"date" : { "$dateFromString" : { "dateString" : "$dateTime"} },
},
"errorCount": {"$sum" : "$errorDetailsList.count"},
}
}],
"rest": [ {$count: 'count'}]
}},
{ "$project": { "_id" : 0,"data": { "$concatArrays": ["$top", "$rest"] }}},
{ "$unwind": "$data" },
{ "$replaceRoot": { "newRoot": "$data" }},
{$sort: {"date" : -1}},
{ $skip: 0 },
{ $limit: 100},
]);
MongoDB 聚合中的 $group
阶段仅保留组规范中的那些字段。
在您的示例管道中,top
部分中的 $group
阶段将 return 仅包含 2 个顶级字段的文档,_id
和 errorCount
.
执行{$sort: {"date" : -1}}
时,顶层没有date
字段,所以排序没有效果。
解决方案:使用 {$sort: {"_id.date" : -1}}
或使用投影将 _id
中嵌入的字段移动到排序前的顶层。
mongodb 排序在使用 facet 和 mongo 聚合时不起作用。使用排序函数后结果未排序。我正在将 utc 日期从 at 转换为日期字符串。
还需要删除每个文档的 _id
请帮我查询一下
使用
输入json有效载荷{
"_id": {
"$oid": "122434543sdf"
},
"eventName": "ev1",
"channelId": "channel1",
"domain": "domain1",
"lob": "lob1",
"eventCategory": "category1",
"producerCSI": "1234",
"topicName": "topic1",
"dateTime": "2021-12-29T20:04:37Z",
"errorDetailsList": [{
"errorType": "Missing data",
"count": {
"$numberLong": "1"
}
}, {
"errorType": "Invalid Data",
"count": {
"$numberLong": "1"
}
}]
}
]
}
Mongo 我写的查询
db.failureevents.aggregate( [
{$unwind: { "path": "$errorDetailsList", "preserveNullAndEmptyArrays": true} },
{$addFields: {errorType: {$arrayElemAt: [{$objectToArray: "$errorDetailsList"}, 0]}}},
{$addFields: {"errorType": "$errorType.v"}},
{$lookup : { "from": "errordescription", "localField": "errorType", "foreignField": "errorType", "as": "dataset" }},
{$unwind: { "path": "$dataset", "preserveNullAndEmptyArrays": true } },
{$facet: {
"top": [
{ "$group": {
"_id": {
"lob": "$lob",
"channel": "$channelId",
"domain": "$domain",
"eventCategory": "$eventCategory",
"prodcuerCSI": "$producerCSI",
"topicName": "$topicName",
"eventName": "$eventName",
"errorType":"$dataset.errorType",
"errorMessage":"$dataset.errorMessage",
"dateTime":"$dateTime",
"date" : { "$dateFromString" : { "dateString" : "$dateTime"} },
},
"errorCount": {"$sum" : "$errorDetailsList.count"},
}
}],
"rest": [ {$count: 'count'}]
}},
{ "$project": { "_id" : 0,"data": { "$concatArrays": ["$top", "$rest"] }}},
{ "$unwind": "$data" },
{ "$replaceRoot": { "newRoot": "$data" }},
{$sort: {"date" : -1}},
{ $skip: 0 },
{ $limit: 100},
]);
MongoDB 聚合中的 $group
阶段仅保留组规范中的那些字段。
在您的示例管道中,top
部分中的 $group
阶段将 return 仅包含 2 个顶级字段的文档,_id
和 errorCount
.
执行{$sort: {"date" : -1}}
时,顶层没有date
字段,所以排序没有效果。
解决方案:使用 {$sort: {"_id.date" : -1}}
或使用投影将 _id
中嵌入的字段移动到排序前的顶层。