我有一个收藏,里面有类似的物品:
{
"_id" : ObjectId("5ab212249a639865c58b744e"),
"levels" : [
{
"levelId" : 0,
"siteId" : "5a0ff11dc7bd083ea6a706b1",
"title" : "Hospital Services"
},
{
"levelId" : 1,
"siteId" : "5a0ff220c7bd083ea6a706d0",
"title" : "Reference Testing"
},
{
"levelId" : 2,
"siteId" : "5a0ff24fc7bd083ea6a706da",
"title" : "Des Moines(Reference Testing)"
}
]
}
我想对关卡数组的第二个对象的标题字段进行排序,例如等级2.标题
目前,我的mongo查询如下:
db.getCollection('5aaf63a69a639865c58b2ab9').aggregate([
{$sort : {'levels.2.title':1}}
])
但是它没有得到预期的结果。
请帮忙。
答案 0 :(得分:1)
您可以在3.6中尝试以下查询。
db.col.aggregate({$sort:{"levels.2.title":1}});
此聚合和查找语义在3.4中有所不同。 jira
此处的更多信息
所以
db.col.find().sort({"levels.2.title":1})
按预期工作,并且聚合排序未按预期工作。
在3.4中使用以下汇总。
使用$arrayElemAt
投影$addFields
中的第二个元素,以将计算出的值保留为文档中的多余字段,然后进行$sort
字段排序。
$project
,但要删除排序字段才能获得预期的输出。
db.col.aggregate([
{"$addFields":{ "sort_element":{"$arrayElemAt":["$levels", 2]}}},
{"$sort":{"sort_element.title":-1}},
{"$project":{"sort_element":0}}
])
此外,您可以使用$let
表达式在$addFields
阶段直接输出标题字段。
db.col.aggregate([
{"$addFields":{ "sort_field":{"$let:{"vars":{"ele":{$arrayElemAt":["$levels", 2]}}, in:"$$ele.title"}}}},
{"$sort":{"sort_field":-1}},
{"$project":{"sort_field":0}}
])