在MongoDB中对包含多个对象的数组进行排序时的行为

z3yyvxxp  于 2022-11-22  发布在  Go
关注(0)|答案(1)|浏览(123)

我有这个收藏。

[
  {
    "id": 0,
    "name": [
      {
        "family": "A",
        "given": [ "Z" ],
        "use": 0
      },
    ],
  },
  {
    "id": 1,
    "name": [
      {
        "family": "Z",
        "given": [ "A" ],
        "use": 1
      },
    ],
  },
]

我自然理解name.family上以下排序的行为。

db.collection.aggregate([
  {
    $sort: {
      "name.family": 1
    }
  }
])

但是,我并不完全理解mongo在playGround中对整个name数组进行排序时的行为。
在这种情况下,是否首先进行了排序?
如果排序,mongoDB如何以及在哪里引用数组?

  • 谢谢-谢谢
bvn4nwqk

bvn4nwqk1#

TLDR;在本例中,Mongo Recursively compares key-value pairs in the order that they appear within the BSON object.
来自文档的所有信息:https://www.mongodb.com/docs/manual/reference/bson-type-comparison-order/
Mongo按以下顺序排序:

1) MinKey (internal type)
2) Null
3) Numbers (ints, longs, doubles, decimals)
4) Symbol, String
5) Object
6) Array
7) BinData
8) ObjectId
9) Boolean
10) Date
11) Timestamp
12) Regular Expression
13) MaxKey (internal type)

所以虽然name是一个数组,但数组中的项是一个对象,所以我相信它:Recursively compare key-value pairs in the order that they appear within the BSON object.(来自上面链接的文档)
在您的游戏示例{$sort:{"name":1}}中,第一个条目的第一个字段是“family”,因此第一个排序操作是在该文档的该字段上执行的。
如果更改第一个对象,使其具有不同的第一个字段:

{
  "use": 0,
  "family": "A",
  "given": [
    "Z"
  ]
}

顺序排序将使用use键以升序给予你一个不同的结果。

相关问题