查找匹配最少数组值的所有文档

时间:2020-12-20 14:25:29

标签: mongodb go

我第一次编写 MongoDB 查询并暂时达到了某个点,但目前卡住了。我查看了 match 属性,但不确定它是否相关。

下面的查询将返回包含至少一个给定的 user 的所有 role 文档。

roles := []string{"admin", "super_admin", "manager", "student"}

a.db.Collection("users").Find(ctx, bson.M{"roles": bson.M{"$in": roles}})

// db.users.find({roles: { $in: ["admin", "super_admin", "manager", "student"] }})

我现在需要的是,指定最低匹配标准。例如,用户文档必须至少匹配 2 个给定的角色(与它们是哪个无关)。我需要使用诸如 EQ, GTE, GT, LT, LTE 运算符之类的东西。

更新

只处理最小匹配就可以了,所以很高兴忽略上面列出的所有运算符。

2 个答案:

答案 0 :(得分:1)

我不确定还有其他简单的方法可以实现这一点,如果您使用的是 MongoDB v4.4,您可以在 find 中使用聚合运算符,或者您可以使用 aggregate(),我不知道 {{ 1}} 语法,但我可以在 MongoDB 驱动程序查询中做到这一点,

  • go 迭代角色数组的循环,将初始值设置为 0,如果当前角色在您输入的角色中,则检查条件然后在初始值中加一,否则返回现有初始值,
  • $reduce 检查返回数是否大于 2 的表达式
$gte

Playground


使用聚合(): Playground

答案 1 :(得分:0)

跟进接受的答案,这是它的 Go 版本。仅供那些可能需要参考的人使用。

    filter := bson.M{
        "$expr": bson.M{
            "$gte": []interface{}{
                bson.M{
                    "$reduce": bson.M{
                        "input":        "$roles",
                        "initialValue": 0,
                        "in": bson.M{
                            "$cond": []interface{}{
                                bson.M{
                                    "$in": []interface{}{
                                        "$$this",
                                        roles, // This is your []string slice
                                    },
                                },
                                bson.M{
                                    "$add": []interface{}{
                                        "$$value",
                                        1,
                                    },
                                },
                                "$$value",
                            },
                        },
                    },
                },
                minMatch, // This is the limit
            },
        },
    }