【问题标题】:$in requires an array as a second argument, found: missing$in 需要一个数组作为第二个参数,发现:缺失
【发布时间】:2023-03-26 02:39:02
【问题描述】:

谁能告诉我我做错了什么?

db文档结构:

{
    "_id" : "module_settings",
    "moduleChildren" : [
        {
            "_id" : "module_settings_general",
            "name" : "General",
        },
        {
            "_id" : "module_settings_users",
            "name" : "Users",
        },
        {
            "_id" : "module_settings_emails",
            "name" : "Emails",
        }
    ],
    “permissions” : [
        "module_settings_general",
        "module_settings_emails"
    ]
}

管道阶段:

{ $project: {
    filteredChildren: {
        $filter: {
           input: "$moduleChildren",
           as: "moduleChild",
           cond: { $in : ["$$moduleChild._id", "$permissions"] }
        }
    },
}}

我需要过滤“moduleChildren”数组以仅显示 ID 位于“permissions”数组中的模块。我试过“$$ROOT.permissions”和“$$CURRENT.permissions”,但它们都不起作用。我总是收到 $in 缺少数组作为参数的错误。当我像这样对数组进行硬编码时它可以工作:cond: { $in : ["$$moduleChild._id", [“module_settings_general", "module_settings_emails”]] } 所以看来问题在于数组的传递。 感谢您的任何建议!

【问题讨论】:

    标签: arrays mongodb mongodb-query aggregation-framework


    【解决方案1】:

    第一个选项 -->使用聚合

    因为您的集合中的某些文档可能包含也可能不包含 permissions 字段或类型不等于数组,这就是您收到此错误的原因。

    您可以找到该字段的$type,如果它不是数组或在您的文档中不存在,则可以将其添加为具有$addFields$cond 聚合的数组

    db.collection.aggregate([
      { "$addFields": {
        "permissions": {
          "$cond": {
            "if": {
              "$ne": [ { "$type": "$permissions" }, "array" ]
            },
            "then": [],
            "else": "$permissions"
          }
        }
      }},
      { "$project": {
        "filteredChildren": {
          "$filter": {
            "input": "$moduleChildren",
            "as": "moduleChild",
            "cond": {
              "$in": [ "$$moduleChild._id", "$permissions" ]
            }
          }
        }
      }}
    ])
    

    第二个选项 -->

    在您正在使用的任何 GUI 上转到您的 mongo shell 或 robomongo 并运行 这个命令

    db.collection.update(
      { "permissions": { "$ne": { "$type": "array" } } },
      { "$set": { "permissions": [] } },
      { "multi": true }
    )
    

    【讨论】:

    • 您的第二个选项擦除了我所有的阵列。谢谢/s
    • @Arrow_Raider 哈哈
    猜你喜欢
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 2018-11-23
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    相关资源
    最近更新 更多