首页 > 解决方案 > 对数组 mongodb 的索引进行排序

问题描述

我有一个集合,其中包含以下对象:

{
    "_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.2.title
目前我的mongo查询看起来像:

db.getCollection('5aaf63a69a639865c58b2ab9').aggregate([
{$sort : {'levels.2.title':1}}
])

但它没有给出预期的结果。
请帮忙。

标签: mongodb

解决方案


您可以在 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}}
])

推荐阅读