Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 查找与最小数组值量匹配的所有文档_Mongodb_Go - Fatal编程技术网

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

Mongodb 查找与最小数组值量匹配的所有文档,mongodb,go,Mongodb,Go,我第一次编写MongoDB查询,目前为止我一直在进行管理,但目前还处于停滞状态。我查看了match属性,但不确定它是否相关 下面的查询将返回至少包含一个给定角色的所有用户文档 roles := []string{"admin", "super_admin", "manager", "student"} a.db.Collection("users").Find(ctx, bson.M{"

我第一次编写MongoDB查询,目前为止我一直在进行管理,但目前还处于停滞状态。我查看了match属性,但不确定它是否相关

下面的查询将返回至少包含一个给定
角色
的所有
用户
文档

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
    ]
  }
})