数组mongodb的索引排序

数组mongodb的索引排序,mongodb,Mongodb,我有一个集合,其中有如下对象: { "_id" : ObjectId("5ab212249a639865c58b744e"), "levels" : [ { "levelId" : 0, "siteId" : "5a0ff11dc7bd083ea6a706b1", "title" : "Hospital Services" }, { "

我有一个集合,其中有如下对象:

{
    "_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)"
        }
    ]
}
我想在levels数组的第二个对象的title字段上排序,例如levels.2.title
目前,我的mongo查询如下所示:

db.getCollection('5aaf63a69a639865c58b2ab9').aggregate([
{$sort : {'levels.2.title':1}}
])
但这并没有产生预期的结果。

请提供帮助。

您可以在3.6中尝试下面的查询

db.col.aggregate({$sort:{"levels.2.title":1}});
这种聚合和查找语义在3.4中有所不同。更多关于这里

所以

按预期工作,聚合排序未按预期工作

在3.4中使用下面的聚合

用于投影第二个元素,以将计算值保留为文档中的额外字段,后跟“排序依据”字段

使用exclusion删除排序字段以获得预期输出

db.col.aggregate([
 {"$addFields":{ "sort_element":{"$arrayElemAt":["$levels", 2]}}}, 
 {"$sort":{"sort_element.title":-1}},
 {"$project":{"sort_element":0}}
])
此外,还可以使用expression直接在stage中输出标题字段


不,不是!!我想在特定对象中的字段上执行。请再分析一下我的问题,看看记录。levels数组第二个对象中标题字段的值为得梅因(参考测试)。我想对它执行排序。是否可以直接使用{$sort:{'levels.2.title':1}?我现在没有测试它。上次我检查时,它似乎不起作用,在文档中找不到任何东西。当你尝试时会发生什么?它会给出随机数据,而不是按照排序。好吧,我做了很多测试。在3.4中,find sort即
db.colname.find().sort({'levels.2.title':1})
在聚合排序不起作用的情况下按预期工作。在3.6中,查找和聚合排序都按预期工作。找到支持我测试的问题。更新了问题的细节
db.col.aggregate([
 {"$addFields":{ "sort_element":{"$arrayElemAt":["$levels", 2]}}}, 
 {"$sort":{"sort_element.title":-1}},
 {"$project":{"sort_element":0}}
])
db.col.aggregate([
 {"$addFields":{ "sort_field":{"$let:{"vars":{"ele":{$arrayElemAt":["$levels", 2]}}, in:"$$ele.title"}}}},      
 {"$sort":{"sort_field":-1}},
 {"$project":{"sort_field":0}}
])