Arrays 使用聚合对MongoDB中的嵌套数组进行排序

Arrays 使用聚合对MongoDB中的嵌套数组进行排序,arrays,mongodb,sorting,nested,Arrays,Mongodb,Sorting,Nested,我正在尝试在父文档上按id排序的基础上对嵌套数组“子类别列表进行排序。mongo新手。如有任何帮助,将不胜感激 以下是示例文档: [ { "_id": 1000, "name": "Automobiles", "parentId": "", "helpText": "Year, Brand, Mo

我正在尝试在父文档上按id排序的基础上对嵌套数组“子类别列表进行排序。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" : ""
        }
    ]
}
它可以帮助你,像这样尝试。。。 也许它不起作用,但它给出了一个想法

它可以帮助你,像这样尝试。。。
可能它不起作用,但它给出了一个想法

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

你可以这样使用它:

db.Category.aggregate([
    {
        $addFields: {
            "subCategoryList":
                {
                    $function: {
                        body: function (categories) {
                            return categories.sort((a, b) => a._id - b._id);
                        },
                        args: ["$subCategoryList"],
                        lang: "js"
                    }
                }
        }
    }
])
对于较小的Mongo版本,您必须首先
$diswind
数组,然后
$sort
数组,最后构建原始结构,或者在您的情况下,由于
$lookup
使用内部数组,您可以使用v3.6中引入的
$lookup
语法在
$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
        }
    }
]);

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

你可以这样使用它:

db.Category.aggregate([
    {
        $addFields: {
            "subCategoryList":
                {
                    $function: {
                        body: function (categories) {
                            return categories.sort((a, b) => a._id - b._id);
                        },
                        args: ["$subCategoryList"],
                        lang: "js"
                    }
                }
        }
    }
])
对于较小的Mongo版本,您必须首先
$diswind
数组,然后
$sort
数组,最后构建原始结构,或者在您的情况下,由于
$lookup
使用内部数组,您可以使用v3.6中引入的
$lookup
语法在
$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
        }
    }
]);

谢谢Tom。我也会从Java客户端试试这个。谢谢Tom。我也会从Java客户端试试这个。