{"record":{"id":"ba4d49bc7d448f48","repo":"siyuan-note/siyuan","slug":"filters-must-be-an-array","errorCode":null,"errorMessage":"filters must be an array","messagePattern":"filters must be an array","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"kernel/model/attribute_view_key_config.go","lineNumber":118,"sourceCode":"\t\t\t\treturn fmt.Errorf(\"%s requires a date field\", setting)\n\t\t\t}\n\t\t\tif \"autoFillNow\" == setting {\n\t\t\t\treturn setAttributeViewColDateFillCreated(op)\n\t\t\t}\n\t\t\treturn setAttrViewColDateFillSpecificTime(op)\n\t\tcase \"options\", \"optionUpdate\", \"optionRemove\":\n\t\t\tif av.KeyTypeSelect != key.Type && av.KeyTypeMSelect != key.Type {\n\t\t\t\treturn errors.New(\"option settings require a select or mSelect field\")\n\t\t\t}\n\t\t\treturn updateAttributeViewKeyOptions(attrView, key, op, setting, value)\n\t\tcase \"relation\":\n\t\t\treturn updateAttributeViewKeyRelation(key, op, value)\n\t\tcase \"rollup\":\n\t\t\treturn updateAttributeViewKeyRollup(attrView, key, op, value)\n\t\tcase \"relationFilters\", \"rollupFilters\":\n\t\t\tfilters, ok := value.([]any)\n\t\t\tif !ok {\n\t\t\t\treturn errors.New(\"filters must be an array\")\n\t\t\t}\n\t\t\tif err = validateAttributeViewKeyFilters(attrView, key, setting, filters); nil != err {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\treturn setAttrViewColFilters(avID, \"\", keyID, filters, \"relationFilters\" == setting)\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"unknown field setting: %s\", setting)\n\t\t}\n\t}\n\treturn\n}\n\nfunc validateAttributeViewKeyFilters(attrView *av.AttributeView, key *av.Key, setting string, value []any) error {\n\trelationKey := key\n\tif \"rollupFilters\" == setting {\n\t\tif av.KeyTypeRollup != key.Type || nil == key.Rollup {\n\t\t\treturn errors.New(\"rollupFilters requires a configured rollup field\")\n\t\t}","sourceCodeStart":100,"sourceCodeEnd":136,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/9f775e8a12daef8255556097396f9b2739078892/kernel/model/attribute_view_key_config.go#L100-L136","documentation":"The settings 'relationFilters' and 'rollupFilters' expect the config value to be an array of filter objects. UpdateAttributeViewKeyConfig type-asserts the value to []any; if the JSON value is an object, string, or null instead of an array, it returns 'filters must be an array'.","triggerScenarios":"Calling UpdateAttributeViewKeyConfig with {\"relationFilters\": {\"value\": ...}} (object instead of array), {\"rollupFilters\": null}, or {\"relationFilters\": \"\"}.","commonSituations":"A client sends a single filter object without wrapping it in an array; a null is passed when no filters are intended (use an empty array [] instead); a payload built by string concatenation loses array structure.","solutions":["Wrap the filter(s) in a JSON array: {\"relationFilters\": [{...}]} .","Pass [] (empty array) rather than null to clear filters.","Validate the payload with Array.isArray(value) (JS) or a schema check before sending."],"exampleFix":"// before\n{\"relationFilters\": {\"column\": \"foo\", \"value\": {}}}\n// after\n{\"relationFilters\": [{\"column\": \"foo\", \"value\": {}}]}","handlingStrategy":"type-guard","validationCode":"// JS: ensure array before sending filters\nif (!Array.isArray(filters)) throw new TypeError(\"filters must be an array\");","typeGuard":"function isFilterArray(v) { return Array.isArray(v) && v.every(f => f && typeof f === \"object\"); }","tryCatchPattern":"try { await updateKeyConfig(avID, keyID, { relationFilters: filters }); } catch (e) { if (String(e).includes(\"filters must be an array\")) { throw new TypeError(\"Wrap filters in an array; use [] to clear\"); } throw e; }","preventionTips":["Always pass arrays; use [] instead of null to clear filters","Wrap single filters in [filter]","Validate payloads with Array.isArray before the API call"],"tags":["type-mismatch","filters","attribute-view"],"backgroundTag":"invalid-argument-format","analyzedSha":"9f775e8a12daef8255556097396f9b2739078892","analyzedAt":"2026-09-19T03:17:15.984Z","contentChangedAt":"2026-09-19T03:17:15.984Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}