如何比较 mongodb 4.4 中的排序和查找?

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

我是 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
... 你能给我指出正确的方向吗?

mongodb sorting mongodb-query aggregation-framework
1个回答
0
投票

在最后的分组阶段之后,您可以检查

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] }] }
              ]
            }
          ]
        }
      }
    }
  }
}

游乐场

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