比较嵌套数组和mongo

伏都先生

我需要将两个嵌套数组与mongo进行比较,但我并不是真正的专家,因此我需要一些帮助。

假设我有一个包含数组的文档slots

[
    [
        {
            "start": 1,
            "end": 2
        }
    ],
    [
        {
            "start": 3,
            "end": 4
        },
        {
            "start": 5,
            "end": 6
        }
    ]
]

而且我需要知道另一个数组是否是它的子集:

db.collection.aggregate([
  {
    $project: {
      slots: {
        $setIsSubset: [
          [
            [
              {
                start: 1,
                end: 2
              }
            ],
            [
              {
                start: 3,
                end: 4
              },
              {
                start: 5,
                end: 6
              }
            ]
          ],
          "$slots"
        ]
      }
    }
  }
])

这返回true,但是如果我删除第二个子数组中的一个元素,则由于子数组不再相等而返回false。

我想做一些$map比较每个子数组的地方,但是我意识到我不知道如何引用我们要比较的数组的索引。

有任何想法吗?谢谢

编辑:存储数组的第一级以及我们要与之比较的数组是一周中的几天,因此需要保留信息。

在线沙箱

米克尔

如果您将这些嵌套数组视为一周中的几天,则可能需要每天进行比较,并检查所有“对”是否都是子集。为此,可以使用$ addFields将输入添加为另一个字段,然后在下一步中根据$ range运算符生成的索引每天运行$ setIsSubset如果所有元素都为true($ allElementsTrue),则意味着您每天指定一个子集:

var input = [
    [
        {
        start: 1,
        end: 2
        }
    ],
    [
        {
        start: 5,
        end: 6
        }
    ]
];

db.col.aggregate([
    {
        $addFields: {
            inputArray: input
        }
    },
    {
        $project: {
            isSubset: {
                $allElementsTrue: {
                    $map: {
                        input: { $range: [ 0, { $size: "$slots" } ] },
                        as: "index",
                        in: {
                            $setIsSubset: [
                                { $arrayElemAt: [ "$inputArray", "$$index" ] },
                                { $arrayElemAt: [ "$slots", "$$index" ] }
                            ]
                        }
                    }
                }
            }
        }
    }
])

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章