{"record":{"id":"8a143458f81d5f38","repo":"litedb-org/LiteDB","slug":"top-k-must-be-greater-than-zero","errorCode":null,"errorMessage":"Top-K must be greater than zero.","messagePattern":"Top-K must be greater than zero\\.","errorType":"exception","errorClass":"ArgumentOutOfRangeException","httpStatus":null,"severity":"error","filePath":"LiteDB/Client/Database/LiteQueryable.cs","lineNumber":302,"sourceCode":"        }\n\n        internal ILiteQueryableResult<T> VectorTopKNear<K>(Expression<Func<T, K>> field, float[] target, int k)\n        {\n            var fieldExpr = _mapper.GetExpression(field);\n            return this.VectorTopKNear(fieldExpr, target, k);\n        }\n\n        internal ILiteQueryableResult<T> VectorTopKNear(string field, float[] target, int k)\n        {\n            var fieldExpr = BsonExpression.Create($\"$.{field}\");\n            return this.VectorTopKNear(fieldExpr, target, k);\n        }\n\n        internal ILiteQueryableResult<T> VectorTopKNear(BsonExpression fieldExpr, float[] target, int k)\n        {\n            if (fieldExpr == null) throw new ArgumentNullException(nameof(fieldExpr));\n            if (target == null || target.Length == 0) throw new ArgumentException(\"Target vector must be provided.\", nameof(target));\n            if (k <= 0) throw new ArgumentOutOfRangeException(nameof(k), \"Top-K must be greater than zero.\");\n\n            var targetArray = new BsonArray(target.Select(v => new BsonValue(v)));\n\n            // Build VECTOR_SIM as order clause\n            var simExpr = BsonExpression.Create($\"VECTOR_SIM({fieldExpr.Source}, @0)\", targetArray);\n\n            _query.VectorField = fieldExpr.Source;\n            _query.VectorTarget = target?.ToArray();\n            _query.VectorMaxDistance = double.MaxValue;\n\n            return this\n                .OrderBy(simExpr, Query.Ascending)\n                .Limit(k);\n        }\n\n        [Obsolete(\"Add `using LiteDB.Vector;` and call the LiteQueryableVectorExtensions.WhereNear extension instead.\")]\n        public ILiteQueryable<T> WhereNear(string vectorField, float[] target, double maxDistance)\n        {","sourceCodeStart":284,"sourceCodeEnd":320,"githubUrl":"https://github.com/litedb-org/LiteDB/blob/f906a5f850678719e39a39a006cb66dcae563cfa/LiteDB/Client/Database/LiteQueryable.cs#L284-L320","documentation":"Thrown by VectorTopKNear(BsonExpression, float[], int) when k <= 0. Top-K must request at least one result; a non-positive k is meaningless and is rejected before building the order clause. Note the validation runs after fieldExpr and target checks.","triggerScenarios":"Calling VectorTopKNear(field, vec, 0), VectorTopKNear(field, vec, -5), or passing a k computed from a count that is zero (e.g. page size from config unset).","commonSituations":"Reading k from a config/pagination parameter defaulting to 0, computing k as resultsPerPage * (page-1) on page 1 with an off-by-one, or passing an unset int field.","solutions":["Clamp k to at least 1, e.g. var k = Math.Max(1, requestedK).","Validate the source of k (config, query string) before calling.","If k=0 legitimately means 'no results', short-circuit and return empty instead of calling the API."],"exampleFix":"// before\nvar top = col.Query().VectorTopKNear(\"$.embedding\", vec, requestedK).ToList();\n\n// after\nvar k = Math.Max(1, requestedK);\nvar top = col.Query().VectorTopKNear(\"$.embedding\", vec, k).ToList();","handlingStrategy":"validation","validationCode":"var k = Math.Max(1, requestedK);","typeGuard":"static bool IsValidK(int k) => k > 0;","tryCatchPattern":null,"preventionTips":["Clamp k from config/pagination to at least 1.","Treat k=0 as 'no results' and return early instead of calling the API."],"tags":["vector","vector-search","topk","argument-range"],"backgroundTag":null,"analyzedSha":"f906a5f850678719e39a39a006cb66dcae563cfa","analyzedAt":"2026-08-13T21:56:30.148Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}