【问题标题】:Sort by $lookup fields按 $lookup 字段排序
【发布时间】:2019-01-14 19:14:11
【问题描述】:

如何按字段“options.optionValue”排序,例如:A、B、C、D、E

我在下面做错了什么:

查询:

db.perguntas.aggregate([
    {"$lookup":{
        "from": "perguntarespostas",
        "localField": "perguntaId",
        "foreignField": "perguntaId",
        "as": "opcoes"
        }
    },
    {"$match":{"opcoes.opcaoValor":{"$exists": true}}},
    {"$project": {"_id": 1, "perguntaId":1, "enunciado": 1,"opcaoCerta":1, "opcoes": {"opcao":1,"opcaoValor":1,"perguntaId":1}}},
    {"$sort": {"opcoes.opcaoValor":1}},
])

结果:

{
    "_id" : ObjectId("5c363c459de150335880ce76"),
    "perguntaId" : 18332,
    "enunciado" : "Considerando-se as ações constitucionais típicas, poderá o Estado de São Paulo ajuizar",
    "opcaoCerta" : "A",
    "opcoes" : [ 
        {
            "perguntaId" : 18332,
            "opcao" : "b) ação de desapropriação, habeas data e ação direta de inconstitucionalidade.",
            "opcaoValor" : "B"
        }, 
        {
            "perguntaId" : 18332,
            "opcao" : "d) argüição de descumprimento de preceito fundamental, ação declaratória de constitucionalidade e mandado de segurança.",
            "opcaoValor" : "D"
        }, 
        {
            "perguntaId" : 18332,
            "opcao" : "c) ação direta de inconstitucionalidade, mandado de segurança coletivo e ação popular.",
            "opcaoValor" : "C"
        }, 
        {
            "perguntaId" : 18332,
            "opcao" : "e) ação de desapropriação, argüição de descumprimento de preceito fundamental e habeas data.",
            "opcaoValor" : "E"
        }, 
        {
            "perguntaId" : 18332,
            "opcao" : "a) ação coletiva, mandado de segurança e mandado de injunção.",
            "opcaoValor" : "A"
        }
    ]
}

我必须在上面进行更改才能通过按字段“opcaoValor”排序来获得预期结果。

【问题讨论】:

    标签: arrays node.js mongodb


    【解决方案1】:

    您可以使用$lookupletpipeline 的变体来订购mongo 3.6 及更高版本中的连接文档

    db.perguntas.aggregate([
        {$lookup:{
            from: "perguntarespostas",
            let: { perguntaId : "$perguntaId"},
            pipeline: [
                {$match:{
                    $expr : {$eq : ["$perguntaId", "$$perguntaId"]}
                }},
                {$sort : {opcaoValor : 1}}
            ],
            as: "opcoes"
            }
        }
    ]).pretty()
    

    在 3.6 版本以下的 mongo 中,您可以通过 $unwind$sort$group$project 获得预期的输出

    db.perguntas.aggregate([
        {"$lookup":{
            "from": "perguntarespostas",
            "localField": "perguntaId",
            "foreignField": "perguntaId",
            "as": "opcoes"
            }
        },
        {"$match":{"opcoes.opcaoValor":{"$exists": true}}},
        {"$project": {"_id": 1, "perguntaId":1, "enunciado": 1,"opcaoCerta":1, "opcoes": {"opcao":1,"opcaoValor":1,"perguntaId":1}}},
        {"$unwind" : "$opcoes"},
        {"$sort": {"opcoes.opcaoValor":1}},
        {"$group" : {_id : "$perguntaId", opcoes : {$push : "$opcoes"}}}, //group all fields
        {"$project" : {perguntaId : "$perguntaId",opcoes : "$opcoes"}} //project all fields
    ]).pretty()
    

    输出

    {
            "_id" : ObjectId("5c3d434dd74266980e8db1b6"),
            "perguntaId" : 18332,
            "opcoes" : [
                    {
                            "_id" : ObjectId("5c3d4376d74266980e8db1bb"),
                            "perguntaId" : 18332,
                            "opcao" : "a) ação coletiva, mandado de segurança e mandado de injunção.",
                            "opcaoValor" : "A"
                    },
                    {
                            "_id" : ObjectId("5c3d4376d74266980e8db1b7"),
                            "perguntaId" : 18332,
                            "opcao" : "b) ação de desapropriação, habeas data e ação direta de inconstitucionalidade.",
                            "opcaoValor" : "B"
                    },
                    {
                            "_id" : ObjectId("5c3d4376d74266980e8db1b9"),
                            "perguntaId" : 18332,
                            "opcao" : "c) ação direta de inconstitucionalidade, mandado de segurança coletivo e ação popular.",
                            "opcaoValor" : "C"
                    },
                    {
                            "_id" : ObjectId("5c3d4376d74266980e8db1b8"),
                            "perguntaId" : 18332,
                            "opcao" : "d) argüição de descumprimento de preceito fundamental, ação declaratória de constitucionalidade e mandado de segurança.",
                            "opcaoValor" : "D"
                    },
                    {
                            "_id" : ObjectId("5c3d4376d74266980e8db1ba"),
                            "perguntaId" : 18332,
                            "opcao" : "e) ação de desapropriação, argüição de descumprimento de preceito fundamental e habeas data.",
                            "opcaoValor" : "E"
                    }
            ]
    }
    

    【讨论】:

    • 服务器版本是3.2.21,我会尝试升级到新版本3.6,我会测试你的建议。现在非常感谢您。
    猜你喜欢
    • 2019-01-27
    • 2019-11-08
    • 2012-11-08
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    相关资源
    最近更新 更多