当按数组中的子字段排序时,sort() 在 MongoDB 中做了什么?
What does sort() do in MongoDB when sorting by a sub-field in an array?
想象一下有一个这样的 Mongo 集合:
[
{
"roleName":"slave",
"id":2,
"__uc__roleName":"SLAVE",
"_children":{
"managers":[
]
},
"_id":ObjectId("5508e3e5875cbdcc712feda6"),
"_clean":true
},
{
"__uc__roleName":"BOSS",
"_children":{
"managers":[
{
"name":"Tony",
"surname":"Mobily",
"roleId":0,
"id":0,
"__uc__name":"TONY",
"__uc__surname":"MOBILY",
"_children":{
}
}
]
},
"_clean":true,
"_id":ObjectId("5508e3a9875cbdcc712feda4"),
"id":0,
"roleName":"boss"
},
{
"__uc__roleName":"EMPLOYEE",
"_children":{
"managers":[
{
"name":"Chiara",
"surname":"Mobily",
"roleId":1,
"id":1,
"__uc__name":"CHIARA",
"__uc__surname":"MOBILY",
"_children":{
}
},
{
"name":"Sara",
"surname":"Fabbietti",
"roleId":1,
"id":2,
"__uc__name":"SARA",
"__uc__surname":"FABBIETTI",
"_children":{
}
},
{
"name":"Daniela",
"surname":"Mobily",
"roleId":1,
"id":3,
"__uc__name":"DANIELA",
"__uc__surname":"MOBILY",
"_children":{
}
}
]
},
"_clean":true,
"_id":ObjectId("5508e3e0875cbdcc712feda5"),
"id":1,
"roleName":"employee"
}
]
这个查询的预期结果是什么:
db.roles.find().sort( {'_children.managers.name': 1 } )
实际结果是:
1) 奴隶
2) 员工
3) 老板
但是……为什么?如果您在具有多个元素的数组中按键排序,排序实际上是如何工作的?
升序排序的工作方式与应有的方式完全一致,方法是考虑您在数组中的每个项目中创建的字段引用的值,并考虑其与其他文档相比的值。
当您考虑每个文档中的匹配值时,顺序可能是最直观的,顺序为:
{ "roleName": "SLAVE", "_children.managers.name": null },
{ "roleName": "BOSS", "_children.managers.name":"Tony" },
{ "roleName": "EMPLOYEE", "_children.managers.name":"Chiara" }
那是因为那将是每个文档中该字段的 "least"(升序)排序值。
按升序对“_children.managers.name”进行排序时,文档结果为:
{ "roleName": "SLAVE", "_children.managers.name": null },
{ "roleName": "EMPLOYEE", "_children.managers.name":"Chiara" }
{ "roleName": "BOSS", "_children.managers.name":"Tony" },
您是这样看的。
所以它是文档值的 "ordered" 多键条目,并且文档的每个值都与其他值进行了比较。
想象一下有一个这样的 Mongo 集合:
[
{
"roleName":"slave",
"id":2,
"__uc__roleName":"SLAVE",
"_children":{
"managers":[
]
},
"_id":ObjectId("5508e3e5875cbdcc712feda6"),
"_clean":true
},
{
"__uc__roleName":"BOSS",
"_children":{
"managers":[
{
"name":"Tony",
"surname":"Mobily",
"roleId":0,
"id":0,
"__uc__name":"TONY",
"__uc__surname":"MOBILY",
"_children":{
}
}
]
},
"_clean":true,
"_id":ObjectId("5508e3a9875cbdcc712feda4"),
"id":0,
"roleName":"boss"
},
{
"__uc__roleName":"EMPLOYEE",
"_children":{
"managers":[
{
"name":"Chiara",
"surname":"Mobily",
"roleId":1,
"id":1,
"__uc__name":"CHIARA",
"__uc__surname":"MOBILY",
"_children":{
}
},
{
"name":"Sara",
"surname":"Fabbietti",
"roleId":1,
"id":2,
"__uc__name":"SARA",
"__uc__surname":"FABBIETTI",
"_children":{
}
},
{
"name":"Daniela",
"surname":"Mobily",
"roleId":1,
"id":3,
"__uc__name":"DANIELA",
"__uc__surname":"MOBILY",
"_children":{
}
}
]
},
"_clean":true,
"_id":ObjectId("5508e3e0875cbdcc712feda5"),
"id":1,
"roleName":"employee"
}
]
这个查询的预期结果是什么:
db.roles.find().sort( {'_children.managers.name': 1 } )
实际结果是:
1) 奴隶
2) 员工
3) 老板
但是……为什么?如果您在具有多个元素的数组中按键排序,排序实际上是如何工作的?
升序排序的工作方式与应有的方式完全一致,方法是考虑您在数组中的每个项目中创建的字段引用的值,并考虑其与其他文档相比的值。
当您考虑每个文档中的匹配值时,顺序可能是最直观的,顺序为:
{ "roleName": "SLAVE", "_children.managers.name": null },
{ "roleName": "BOSS", "_children.managers.name":"Tony" },
{ "roleName": "EMPLOYEE", "_children.managers.name":"Chiara" }
那是因为那将是每个文档中该字段的 "least"(升序)排序值。
按升序对“_children.managers.name”进行排序时,文档结果为:
{ "roleName": "SLAVE", "_children.managers.name": null },
{ "roleName": "EMPLOYEE", "_children.managers.name":"Chiara" }
{ "roleName": "BOSS", "_children.managers.name":"Tony" },
您是这样看的。
所以它是文档值的 "ordered" 多键条目,并且文档的每个值都与其他值进行了比较。