Mongodb 查找与最小数组值量匹配的所有文档
我第一次编写MongoDB查询,目前为止我一直在进行管理,但目前还处于停滞状态。我查看了match属性,但不确定它是否相关 下面的查询将返回至少包含一个给定Mongodb 查找与最小数组值量匹配的所有文档,mongodb,go,Mongodb,Go,我第一次编写MongoDB查询,目前为止我一直在进行管理,但目前还处于停滞状态。我查看了match属性,但不确定它是否相关 下面的查询将返回至少包含一个给定角色的所有用户文档 roles := []string{"admin", "super_admin", "manager", "student"} a.db.Collection("users").Find(ctx, bson.M{"
角色
的所有用户
文档
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的操作符
更新
只处理最小匹配是可以的,因此很高兴忽略上面列出的所有运算符。我不确定是否有其他简单的方法来实现这一点,如果您使用的是MongoDB v4.4,您可以在find中使用聚合运算符,或者您可以使用聚合(),我不知道go
语法,但我可以在MongoDB驱动程序查询中完成
$reduce
要迭代角色数组的循环,请将初始值设置为0,检查当前角色是否在输入角色中,然后在初始值中添加一个,否则返回现有初始值
- 用
$gte
检查返回值大于2的表达式
使用聚合():
根据已接受的答案,这是它的Go版本。只是为了那些可能需要一些参考的人
filter:=bson.M{
“$expr”:bson.M{
“$gte”:[]接口{}{
bson.M{
“$reduce”:bson.M{
“输入”:“$roles”,
“初始值”:0,
“in”:bson.M{
“$cond”:[]接口{}{
bson.M{
“$in”:[]接口{}{
“$$this”,
roles,//这是您的[]字符串片
},
},
bson.M{
“$add”:[]接口{}{
“$$value”,
1.
},
},
“$$value”,
},
},
},
},
minMatch,//这是限制
},
},
}
文档中的角色类型字段是什么?它是数组并且有多个角色吗?没错,它是一个带有字符串值的数组。谢谢。两者都很好。现在我必须把它们变成围棋查询,这应该很有趣!
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
]
}
})