如何按字段“ 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”进行排序来获得预期的结果,我必须做些改变。
答案 0 :(得分:0)
您可以将$lookup
与let
和pipeline
结合使用,以订购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"
}
]
}