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