【问题标题】:Mongodb sorting issue when using facet使用 facet 时的 Mongodb 排序问题
【发布时间】:2021-12-30 20:11:04
【问题描述】:

使用 facet 和 mongo 聚合时,mongodb 排序不起作用。使用排序功能后,结果未排序。我正在将 utc 日期 fromat 转换为日期字符串。

还需要删除每个文档的_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},
 ]);

【问题讨论】:

  • 你能给我们举个例子来说明期望的输出是什么样的吗?除了证明什么不起作用之外,也许还可以稍微解释一下您正在尝试做什么。我也不明白为什么eventName$group 的一部分。在这个数据设计中事件名称不是唯一的吗?为什么要尽早查找错误描述而不是收集计数然后进行查找以获取描述?
  • 在您对文档进行排序时,没有名为“日期”的顶级字段

标签: mongodb mongodb-query aggregation-framework pymongo


【解决方案1】:

MongoDB 聚合中的$group 阶段仅保留组规范中的那些字段。

在您的示例管道中,top 部分中的$group 阶段将返回只有两个顶级字段_iderrorCount 的文档。

{$sort: {"date" : -1}}执行时,顶层没有date字段,所以排序没有效果。

解决方案:要么使用{$sort: {"_id.date" : -1}},要么使用投影,将嵌入在_id 中的字段移动到排序前的顶层。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 2021-02-01
    • 1970-01-01
    • 2019-12-20
    • 2021-01-03
    • 2021-06-02
    • 2021-09-08
    相关资源
    最近更新 更多