按$ lookup字段排序

时间:2019-01-14 19:14:12

标签: arrays node.js mongodb

如何按字段“ 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”进行排序来获得预期的结果,我必须做些改变。

1 个答案:

答案 0 :(得分:0)

您可以将$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"
                }
        ]
}