比较嵌套数组和mongo

时间:2019-03-11 15:42:45

标签: mongodb

我需要将两个嵌套数组与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来比较每个子数组,但是我意识到我不知道如何引用我们要比较的数组的索引。

有什么想法吗?谢谢

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

Online sandbox

1 个答案:

答案 0 :(得分:2)

如果您将这些嵌套数组视为一周中的几天,则可能需要每天进行比较,并检查所有“对”是否都是子集。为此,您可以使用$addFields将输入添加为另一个字段,然后在下一步中根据$setIsSubset运算符生成的索引每天运行$range。如果所有元素都为真($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" ] }
                            ]
                        }
                    }
                }
            }
        }
    }
])