arrays - $ in需要一個數組作為第二個參數,發現:缺失



mongodb mongodb-query (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 }
)

任何人都可以告訴我,我做錯了什麼?

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在“權限”數組中。 我試過“$$ ROOT.permissions”和“$$ CURRENT.permissions”,但沒有一個能正常工作。 我總是得到一個錯誤,$ in缺少數組作為參數。 當我對這個數組進行硬編碼時它會起作用: cond: { $in : ["$$moduleChild._id", [“module_settings_general", "module_settings_emails”]] } 所以看起來問題在於傳遞數組。 謝謝你的任何建議!





aggregation-framework