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

我第一次编写MongoDB查询,现在已经达到了一定程度,但目前停滞不前。我查看了匹配属性,但不确定它是否相关。


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


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


更新


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


慕的地6264312
浏览 115回答 2
2回答

慕娘9325324

我不确定有没有其他简单的方法来实现这一点,如果你使用的是MongoDB v4.4,你可以在find中使用聚合运算符,或者你可以使用,我不知道语法,但我可以在MongoDB驱动程序查询中做到这一点,aggregate()go$reduce迭代角色数组的循环,将初始值设置为 0,检查条件当前角色是否在您输入的角色中,然后在初始值中添加一个,否则返回现有的初始值,检查返回编号大于 2 的表达式$gtedb.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

一只甜甜圈

跟进接受的答案,这是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            },        },    }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go