{"record":{"id":"84f1e9c5d766074b","repo":"mem0ai/mem0","slug":"unsupported-filter-operator-s-for-field-key","errorCode":null,"errorMessage":"Unsupported filter operator(s) for field '${key}': ${ops.join(\", \")}. Supported operators: ${supportedOps.join(\", \")}","messagePattern":"Unsupported filter operator\\(s\\) for field '(.+?)': (.+?)\\. Supported operators: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"mem0-ts/src/oss/src/vector_stores/qdrant.ts","lineNumber":205,"sourceCode":"    if (\"contains\" in value || \"icontains\" in value) {\n      const text = value.contains || value.icontains;\n      return { key, match: { text } };\n    }\n\n    // Unknown operator - treat as nested object for simple match\n    const supportedOps = [\n      \"eq\",\n      \"ne\",\n      \"gt\",\n      \"gte\",\n      \"lt\",\n      \"lte\",\n      \"in\",\n      \"nin\",\n      \"contains\",\n      \"icontains\",\n    ];\n    throw new Error(\n      `Unsupported filter operator(s) for field '${key}': ${ops.join(\", \")}. ` +\n        `Supported operators: ${supportedOps.join(\", \")}`,\n    );\n  }\n\n  /**\n   * Create a Filter object from the provided filters.\n   * Supports logical operators (AND, OR, NOT) and comparison operators.\n   */\n  private createFilter(filters?: SearchFilters): QdrantFilter | undefined {\n    if (!filters || Object.keys(filters).length === 0) return undefined;\n\n    // Normalize $or/$not/$and → OR/NOT/AND and deduplicate\n    const normalized: Record<string, any> = {};\n    for (const [key, value] of Object.entries(filters)) {\n      const normKey = KEY_MAP[key] || key;\n      if (!(normKey in normalized)) {\n        normalized[normKey] = value;","sourceCodeStart":187,"sourceCodeEnd":223,"githubUrl":"https://github.com/mem0ai/mem0/blob/001c235229be8795e3834520467bd0d661ed8f34/mem0-ts/src/oss/src/vector_stores/qdrant.ts#L187-L223","documentation":"The Qdrant filter builder falls through to this error when an object-valued filter field contains operators outside the supported set: eq, ne, gt, gte, lt, lte, in, nin, contains, icontains. It exists because Qdrant's filter model has no translation for other operators.","triggerScenarios":"Passing filters like { f: { between: [1, 2] } }, { f: { $gte: 1 } }, { f: { hasAll: [...] } }, or an object with typo'd operator names such as { f: { gteq: 1 } }.","commonSituations":"Porting filter code from Mongo/Postgres syntax; typos in operator keys; combining API request payloads with extra keys inside operator objects.","solutions":["Rewrite the filter using only supported operators: eq, ne, gt, gte, lt, lte, in, nin, contains, icontains","Remove '$' prefixes from Mongo-style operators","Express 'between' as { gte: lo, lte: hi } and 'hasAll' as a nested contains/in combination or separate AND entries"],"exampleFix":"// before\nconst r = await vs.search(vec, { filters: { age: { between: [20, 30] } } });\n\n// after\nconst r = await vs.search(vec, { filters: { age: { gte: 20, lte: 30 } } });","handlingStrategy":"validation","validationCode":"const QDRANT_OPS = new Set(['eq','ne','gt','gte','lt','lte','in','nin','contains','icontains']);\nfunction validateQdrantFilters(filters: any): void {\n  for (const v of Object.values(filters ?? {})) {\n    if (v && typeof v === 'object' && !Array.isArray(v)) {\n      for (const op of Object.keys(v)) {\n        if (!QDRANT_OPS.has(op)) throw new Error(`Operator '${op}' unsupported on Qdrant`);\n      }\n    }\n  }\n}\nvalidateQdrantFilters(filters);","typeGuard":"type QdrantOp = 'eq'|'ne'|'gt'|'gte'|'lt'|'lte'|'in'|'nin'|'contains'|'icontains';\nconst isQdrantOp = (op: string): op is QdrantOp =>\n  ['eq','ne','gt','gte','lt','lte','in','nin','contains','icontains'].includes(op);","tryCatchPattern":"try { await vs.search(vec, { filters }); } catch (e) { if (e instanceof Error && e.message.includes('Unsupported filter operator')) { /* rewrite to supported ops, retry */ } throw e; }","preventionTips":["Strip Mongo '$' prefixes at your API boundary","Express 'between' as gte+lte pairs","Share a typed filter schema between client and server"],"tags":["qdrant","search-filters","operator-error","validation","typescript"],"backgroundTag":null,"analyzedSha":"001c235229be8795e3834520467bd0d661ed8f34","analyzedAt":"2026-08-15T01:55:42.685Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}