【问题标题】:Compared nested arrays with mongo将嵌套数组与 mongo 进行比较
【发布时间】:2019-03-11 15:42:45
【问题描述】:

我需要将两个嵌套数组与 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

【问题讨论】:

    标签: mongodb


    【解决方案1】:

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

    【讨论】:

    • 对不起,应该提到我无法提取数组,因为它们的位置很重要(它指的是一周中的一天)。我将编辑 OP。
    • @MrVoodoo 所以也许你可以将slots 保留为原始数组,但在扁平数组上运行$setIsSubset 只是为了检查子集是否匹配?
    • 在某些情况下,即使不应该通过,检查也会通过。例如星期一有 {start: 1, end: 2},我想检查星期二是否有 {start: 1, end: 2},它会通过测试。
    • @MrVoodoo 我明白了,修改了我的答案
    • 你为什么要问这个实际上我的一位同事得到了两个很棒的礼物篮(包含两个杯子、T恤、瓶子和更多)来自stackoverflow。她参加了一些关于stackoverflow的比赛,我对此不太了解,但她参加了。我在 metaexchange 上读到了这一点,并了解到 SO 奖励 100k 代表,但她只有 1k。所以我想知道我是否遗漏了什么。顺便说一句,谢谢
    猜你喜欢
    • 2020-02-26
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    相关资源
    最近更新 更多