MongoDB - 根据数组字段对文档进行排序

问题描述 投票:0回答:2

以下是该集合的示例文档。

{
  "name": "sam",
  "age": 20,
  "hobbies": [ 
    { "id": 1, value: "football" }, 
    { "id": 2, value: "chess" } 
  ]
},
{
  "name": "Bob",
  "age": 30,
  "hobbies": [
    { "id": 1, "value": "painting" },
    { "id": 2, "value": "gardening" }
  ]
},
{
  "name": "Charlie",
  "age": 22,
  "hobbies": [
    { "id": 1, "value": "cycling" },
    { "id": 2, "value": "playing the guitar" },
    { "id": 3, "value": "photography" }
  ]
}

我尝试使用下面的查询,它只对爱好数组进行排序,而不对集合的文档进行排序。

{ $sort: { "hobbies.value": 1 } }

我想根据

hobbies.value
对集合中的文档进行排序,并对数组内的对象进行排序。
对于 asc,预期结果如下所示:

{
  "name": "sam",
  "age": 20,
  "hobbies": [ 
    { "id": 2, "value": "chess" }, 
    { "id": 1, "value": "football" } 
  ]
},
{
  "name": "Charlie",
  "age": 22,
  "hobbies": [
    { "id": 1, "value": "cycling" },
    { "id": 2, "value": "playing the guitar" },
    { "id": 3, "value": "photography" }
  ]
},
{
  "name": "Bob",
  "age": 30,
  "hobbies": [
    { "id": 1, "value": "painting" },
    { "id": 2, "value": "gardening" }
  ]
}
mongodb sorting mongoose mongodb-query
2个回答
1
投票
  1. 您当前的查询正在按降序而不是升序对

    hobbies.value
    数组进行排序。你应该使用
    { "hobbies.value": 1 }

  2. 要对数组中的对象进行排序,您需要

    $sortArray
    运算符。

db.collection.aggregate([
  {
    $sort: {
      "hobbies.value": 1
    }
  },
  {
    $set: {
      hobbies: {
        $sortArray: {
          input: "$hobbies",
          sortBy: {
            value: 1
          }
        }
      }
    }
  }
])

演示@Mongo Playground


1
投票

按数组字段对文档进行排序并不直观。 来自比较排序顺序文档:

在数组比较中:

小于比较,或升序排序,根据 BSON 类型排序顺序比较数组的最小元素。

大于比较或降序排序,根据反向 BSON 类型排序顺序比较数组的最大元素。

将值为单元素数组的字段(例如,[ 1 ])与非数组字段(例如,2)进行比较时,比较的是 1 和 2。

空数组(例如 [ ])的比较将空数组视为小于空值或缺失字段值。

{$sort:{"hobbies.value":-1}}
会按照 Charlie、Bob、Sam 的顺序对您提供的示例文档进行排序,因为排序时考虑的值为“弹吉他”、“绘画”和“足球”。

要对数组中的值进行排序,请在 $project 或 $addFields 阶段使用 $sortArray 运算符。

© www.soinside.com 2019 - 2024. All rights reserved.