首页 > 解决方案 > 匹配数组的精确项或仅精确数组项的组合_MongoDB

问题描述

假设我们有一个字符串数组。有一个用例必须完成。

let myArray = ['a', 'g', 'd', 'e']

let collections = [

    {items:['a', 'b']},  ==> false

    {items:['a', 'g']}, ==> true

    {items:['d', 'f']},  ==> false

    {items:['a', 'g', 'd', 'e']}, ==> true

    {items:['a', 'g', 'd', 'e', 'o']}, ==> false

    {items:['a', 'g','e']}, ==> true

    {items:['g']}, ==> true

    {items:['g', 'k']}, ==> false
]

我的目标:

  1. 仅与一项完全匹配。
  2. 匹配这些项目的唯一组合。

首先,我知道这个查询对于这个数组的每个项目来说都是非常昂贵的,因为我们有那个查询匹配的阶乘。

如果我们的数组中有 2 个元素,我们就有 2 个可能的查询。如果我们有4 个元素,我们就有4 * 3 * 2 * 1 个可能的查询。

我的第二个问题是:这相关吗?除了用例

标签: mongodbmongoose

解决方案


您可以使用$setIsSubset轻松实现此目的

db.collection.aggregate([
    {
        $addFields: {
            filteredCollections: {
                $filter: {
                    input: "$collections",
                    as: "collection",
                    cond: {
                       $setIsSubset: [
                          ["$$collection.items"],
                          ["a", "g", "d", "e"]
                       ]
                   }
                }
            }
        }
    },
    {
        $match: {
            "filteredCollections.0": {$exists: true}
        }
    }
])

对于完全匹配,您可以使用$all$setIsSubset.


推荐阅读