我第一次编写 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
运算符之类的东西。
更新
只处理最小匹配就可以了,所以很高兴忽略上面列出的所有运算符。
答案 0 :(得分:1)
我不确定还有其他简单的方法可以实现这一点,如果您使用的是 MongoDB v4.4,您可以在 find 中使用聚合运算符,或者您可以使用 aggregate()
,我不知道 {{ 1}} 语法,但我可以在 MongoDB 驱动程序查询中做到这一点,
go
迭代角色数组的循环,将初始值设置为 0,如果当前角色在您输入的角色中,则检查条件然后在初始值中加一,否则返回现有初始值,$reduce
检查返回数是否大于 2 的表达式$gte
使用聚合(): 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
},
},
}