我是 mongodb 新手,我使用的是 4.4 版本,无法更新。
我有一个集合
items
,其属性为categories
(数组)。我想将集合 categories
“加入”($lookup)到它 - 每个类别都有一个 sortOrder
属性 - 以便比较 categories
中的 items
是否与集合中的排序不同 categories
。
到目前为止我的做法:
[
{
$addFields: {
categoriesWithIndex: {
$map: {
input: {$range: [0, {$size: "$categories" }]},
as: "index",
in: {
index: "$$index",
value: {$arrayElemAt: ["$categories", "$$index"]}
}
}
}
}
},
{
$unwind: "$categoriesWithIndex"
},
{
$lookup: {
from: "categories",
localField: "categoriesWithIndex.value",
foreignField: "_id"
as: "categoryDetails"
}
},
{
$addFields: {
"categoriesWithIndex.sortOrder": {
$arrayElemAt: ["$categoryDetails.sortOrder", 0]
}
}
},
{
$group: {
_id: "$_id",
categories: {
$push: {
$mergeObjects: [
{
index: "$categoriesWithIndex.index",
sortOrder: "$categoriesWithIndex.sortOrder",
value: "$categoriesWithIndex.value"
}
]
}
}
}
},
]
现在文档看起来像这样:
_id: "1234"
categories: Array (3)
0: Object
index: 0
sortOrder: "2"
value: "catX"
1: Object
index: 1
sortOrder: "3"
value: "catY"
2: Object
index: 2
sortOrder: "1"
value: "catZ"
现在感觉我已经快到了,但我不知道如何继续。可惜我没有
$sortArray
...
你能给我指出正确的方向吗?
在最后的分组阶段之后,您可以检查
sortOrder
是否按升序排列。如果是,则意味着 items
集合遵循排序顺序。如果它们不按顺序表示 items
集合不遵守排序顺序。$reduce
管道阶段。从 true 开始,检查 n+1 的 sortOrder
值是否 > n。与 $and
结合,如果此条件至少失败一次,您将得到 false。
您可以将其添加为聚合管道中的最后一个阶段
{
$addFields: {
isSortOrderIncreasing: {
$reduce: {
input: { $range: [1, { $size: "$categories" }] },
initialValue: true,
in: {
$and: [
"$$value",
{
$gt: [
{ $arrayElemAt: ["$categories.sortOrder", "$$this"] },
{ $arrayElemAt: ["$categories.sortOrder", { $subtract: ["$$this", 1] }] }
]
}
]
}
}
}
}
}