当按数组中的子字段排序时,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" 多键条目,并且文档的每个值都与其他值进行了比较。