$ in需要一个数组作为第二个参数,发现:缺失

dav*_*idM 4 arrays mongodb mongodb-query aggregation-framework

任何人都可以告诉我,我做错了什么?

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"
    ]
}
Run Code Online (Sandbox Code Playgroud)

管道阶段:

{ $project: {
    filteredChildren: {
        $filter: {
           input: "$moduleChildren",
           as: "moduleChild",
           cond: { $in : ["$$moduleChild._id", "$permissions"] }
        }
    },
}}
Run Code Online (Sandbox Code Playgroud)

我需要过滤"moduleChildren"数组以仅显示哪些ID在"权限"数组中.我试过"$$ ROOT.permissions"和"$$ CURRENT.permissions",但没有一个能正常工作.我总是得到一个错误,$ in缺少数组作为参数.当我像这样硬编码数组时它起作用:cond: { $in : ["$$moduleChild._id", [“module_settings_general", "module_settings_emails”]] }所以看起来问题在于传递数组.谢谢你的任何建议!

Ash*_*shh 8

第一个选项 - >使用聚合

因为您的集合中的某些文档可能包含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" ]
        }
      }
    }
  }}
])
Run Code Online (Sandbox Code Playgroud)

第二个选项 - >

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

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

  • 你的第二个选项擦除了我所有的阵列。谢谢/s (5认同)
  • @Arrow_Raider 哈哈 (2认同)