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

时间:2018-08-01 21:25:49

标签: 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"
    ]
}

管道阶段:

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

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

1 个答案:

答案 0 :(得分:7)

第一个选项->使用汇总

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

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

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