【问题标题】:Sorting nested Array in MongoDB using aggregate使用聚合对 MongoDB 中的嵌套数组进行排序
【发布时间】:2020-07-18 08:18:53
【问题描述】:

我正在尝试在父文档上按 _id 排序的顶部对嵌套数组“subCategoryList”进行排序。mongo 的新手。任何帮助将不胜感激

这里是示例文档:

[
    {
        "_id": 1000,
        "name": "Automobiles",
        "parentId": "",
        "helpText": "Year, Brand, Model, Color, Size"
    },
    {
        "_id": 1004,
        "name": "RV / Campers",
        "parentId": 1000,
        "helpText": ""
    },
    {
        "_id": 1001,
        "name": "Car / SUV / Truck",
        "parentId": 1000,
        "helpText": ""
    }
]

这是我尝试过的:

db.Category.aggregate([
    {
        "$match": {
            "parentId": ""
        }
    },
    {
        "$lookup": {
            "from": "Category", "localField": "_id", "foreignField": "parentId", "as": "subCategoryList"
        }
    },
    {
        $sort: {
            _id: 1
        }
    }
]).pretty()

但我明白了:

    {
    "_id" : 17000,
    "name" : "Music",
    "parentId" : "",
    "helpText" : "Help Text - Brand, Model, Title",
    "subCategoryList" : [
        {
            "_id" : 17001,
            "name" : "DVD / Blu-ray",
            "parentId" : 17000,
            "helpText" : ""
        },
        {
            "_id" : 17002,
            "name" : "Player",
            "parentId" : 17000,
            "helpText" : ""
        }
    ]
}
{
    "_id" : 20000,
    "name" : "Sports Gear",
    "parentId" : "",
    "helpText" : "Help Text - Brand, Model, Gear Type, Size, Color,",
    "subCategoryList" : [
        {
            "_id" : 20002,
            "name" : "Football",
            "parentId" : 20000,
            "helpText" : ""
        },
        {
            "_id" : 20007,
            "name" : "Tennis",
            "parentId" : 20000,
            "helpText" : ""
        },
        {
            "_id" : 20008,
            "name" : "Cricket",
            "parentId" : 20000,
            "helpText" : ""
        },
        {
            "_id" : 20004,
            "name" : "Hockey",
            "parentId" : 20000,
            "helpText" : ""
        },
        {
            "_id" : 20003,
            "name" : "Golf",
            "parentId" : 20000,
            "helpText" : ""
        },
        {
            "_id" : 20006,
            "name" : "Basketball",
            "parentId" : 20000,
            "helpText" : ""
        },
        {
            "_id" : 20005,
            "name" : "Soccer",
            "parentId" : 20000,
            "helpText" : ""
        },
        {
            "_id" : 20010,
            "name" : "Camping / Hiking",
            "parentId" : 20000,
            "helpText" : ""
        },
        {
            "_id" : 20009,
            "name" : "Cycling",
            "parentId" : 20000,
            "helpText" : ""
        },
        {
            "_id" : 20001,
            "name" : "Baseball",
            "parentId" : 20000,
            "helpText" : ""
        },
        {
            "_id" : 20012,
            "name" : "Skiing",
            "parentId" : 20000,
            "helpText" : ""
        },
        {
            "_id" : 20011,
            "name" : "Swimming",
            "parentId" : 20000,
            "helpText" : ""
        },
        {
            "_id" : 20099,
            "name" : "Other",
            "parentId" : 20000,
            "helpText" : ""
        }
    ]
}

【问题讨论】:

    标签: arrays mongodb sorting nested


    【解决方案1】:
    db.hardwares.aggregate([
        {$unwind: "$subCategoryList"},
        {$sort: {"subCategoryList._id": 1}},
        {$group: {_id:"$_id", subCategoryList: {$push:"$subCategoryList"}}}
    ]);
    

    可能对你有帮助,试试这样... 也许它没有用,但它给出了一个想法

    【讨论】:

      【解决方案2】:

      Mongo 没有内置函数来对内部数组进行排序,但是 Mongo v4.4 引入了 $function 聚合运算符。这允许我们在管道中使用自定义 javascript 函数。

      你可以这样使用它:

      db.Category.aggregate([
          {
              $addFields: {
                  "subCategoryList":
                      {
                          $function: {
                              body: function (categories) {
                                  return categories.sort((a, b) => a._id - b._id);
                              },
                              args: ["$subCategoryList"],
                              lang: "js"
                          }
                      }
              }
          }
      ])
      

      对于较小的 Mongo 版本,您必须首先 $unwind 数组。然后$sort 它,最后构造原始结构,或者在你的情况下,因为你是$lookuping 内部数组,你可以使用other $lookup v3.6 中引入的语法到$lookup 内的$sort

      db.Category.aggregate([
          {
              "$match": {
                  "parentId": ""
              }
          },
          {
              "$lookup": {
                  "from": "Category",
                  let: {id: "$_id"},
                  pipeline: [
                      {
                          $match: {
                              $expr: {
                                  $eq: ["$$id", "$parentId"]
                              }
                          }
                      },
                      {
                          $sort: {
                              _id: 1
                          }
                      }
                  ],
                  "as": "subCategoryList"
              }
          },
          {
              $sort: {
                  _id: 1
              }
          }
      ]);
      

      【讨论】:

      • 谢谢汤姆。也将从 Java 客户端尝试此操作。
      猜你喜欢
      • 2019-12-26
      • 2020-02-06
      • 1970-01-01
      • 2020-04-14
      • 2017-07-26
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      • 2015-12-06
      相关资源
      最近更新 更多