mongodb - 对数组 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}}
])
但它没有给出预期的结果。
请帮忙。
解决方案
您可以在 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}}
])
推荐阅读
- java - 如何使用 Java 中的 Base64 对未实现 Serializable 接口的对象进行编码?
- flutter - 解释一些关于在颤动中移动文本的代码
- google-maps - 颤振:谷歌地图状态错误(坏状态:未来已经完成)
- python - Python > Selenium + CSV:Webdriver 读取,访问 .csv 文件中的所有链接
- quickfixj - QuickFIX/J Failover 处理流程
- java - 我可以在没有Java方法体的情况下用maven生成一个jar吗?
- twilio - Twilio/TwiML:处理 webhook url 后呼叫突然挂断
- android - 从 gif / 视频中保存位图
- ios - 使用swiftui时更改状态栏文本颜色?
- python-3.x - 模块已导入,但仍在呈现 NameError