如果将空白数组传递给 $in 运算符,则会出错

Posted

技术标签:

【中文标题】如果将空白数组传递给 $in 运算符,则会出错【英文标题】:$in operator gives error if pass blank array into it 【发布时间】:2022-01-08 20:44:01 【问题描述】:

我参与过 Go 和 MongoDb 项目。其中,我遇到了一个问题。我已经使用 $in 运算符将整数的动态切片 ([]int) 传递到查询中。每件事看起来都不错,但是当这个切片为空时,它会返回一个错误“$in 需要一个数组”。但我将它用作搜索参数,如果我传递空白数组,则它与所有数组匹配。

注意:我使用的是 MongoDB shell 版本 v5.0.3

这是我的代码:

var searchedProfiles []int
searchFilter := bson.M"customer.id": bson.M"$in": searchedProfiles
newQry := []bson.M
    "$lookup": bson.M
        "localField":   "cid",
        "from":         "customers",
        "foreignField": "_id",
        "as":           "customer",
    "$match": searchFilter,

如果有人有任何想法,请告诉我。谢谢!

【问题讨论】:

【参考方案1】:

nil 值不会被编组为空数组,因此请确保 searchedProfiles 不是 nil 但至少是一个空切片:

searchedProfiles = []int

这将被编组为一个空数组,因此您不会收到相关错误。

但这不会给你所有文件,这不会给你任何结果(空列表中没有任何内容)。

如果没有搜索到的个人资料,则将其排除在过滤之外。

【讨论】:

我已经编辑了我的问题,但同样的问题存在。如果我已将空 []int 传递给它,则返回错误而不是空结果。 您是否将一个空切片分配给searchedProfiles?因为问题中的代码不是。此外,如答案中所述,为空数组填充 $in 会给你零个结果,而不是全部。 在我的情况下,如果 searchedProfiles 具有 [1, 2] 等值,那么一切正常,但我们的值 [] 然后它给我类似的错误: "response": "code": 400, "api_status": 0, "message": "Error: #126 - 有问题,请稍后再试。", "data": "Code": 2, "Message": "$in 需要一个数组”,“标签”:null,“名称”:“BadValue”,“包装”:null 是的,我理解您的错误和问题,因为searchedProfilesnil。您必须为其分配一个空的非nil 切片:searchedProfiles = []int。但同样,这不会给你所有的结果,这不会给你任何结果。 如果您将其声明为var searchedProfiles []int,那么它将是nil,这就是我一直在说的。如果为它分配一个切片,它不会是nil,类似于var searchedProfiles = []int

以上是关于如果将空白数组传递给 $in 运算符,则会出错的主要内容,如果未能解决你的问题,请参考以下文章

如何将数组传递给接受带有 splat 运算符的属性的方法?

我如何将在 $match 阶段内传递给 $in 运算符的每个 ID 限制为仅 4 个元素

Java数组运算

将值传递给 Worklight SQL 适配器中的 IN 运算符

将字符串从php传递给js函数

C# 7.2 对运算符使用“in parameter”