为了账号安全,请及时绑定邮箱和手机立即绑定

查找与最小数组值量匹配的所有文档

查找与最小数组值量匹配的所有文档

Go
慕的地6264312 2022-08-01 09:55:49
我第一次编写MongoDB查询,现在已经达到了一定程度,但目前停滞不前。我查看了匹配属性,但不确定它是否相关。下面的查询将返回至少包含一个给定文档的所有文档。userroleroles := []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 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

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

  • $reduce迭代角色数组的循环,将初始值设置为 0,检查条件当前角色是否在您输入的角色中,然后在初始值中添加一个,否则返回现有的初始值,

  • 检查返回编号大于 2 的表达式$gte

db.users.find({

  $expr: {

    $gte: [

      {

        $reduce: {

          input: "$roles",

          initialValue: 0,

          in: {

            $cond: [

              { $in: [$$this", ["admin","super_admin","manager","student"]] },

              { $add: ["$$value", 1] },

              "$$value"

            ]

          }

        }

      },

      2 // input your number

    ]

  }

})

使用 aggregate(): Playground


查看完整回答
反对 回复 2022-08-01
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

跟进接受的答案,这是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

            },

        },

    }


查看完整回答
反对 回复 2022-08-01
  • 2 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信