# FieldData This is the template class that represents column-based data for a single field. Concrete aliases cover every supported data type. Instances of the concrete types are used when inserting data via `InsertRequest::WithRowsData()` or reading query/search results via `QueryResults::OutputField()` and `SingleResult::OutputField()`. ```cpp // Base abstract interface (not instantiated directly) class Field { const std::string& Name() const; DataType Type() const; DataType ElementType() const; // for ARRAY fields only virtual size_t Count() const = 0; virtual void Reserve(size_t count) = 0; }; using FieldDataPtr = std::shared_ptr; // Template class template class FieldData : public Field { explicit FieldData(std::string name); FieldData(std::string name, const std::vector& data); FieldData(std::string name, const std::vector& data, const std::vector& valid_data); StatusCode Add(const T& element); StatusCode AddNull(); StatusCode Append(const std::vector& elements); size_t Count() const; void Reserve(size_t count); virtual const std::vector& Data() const; virtual T Value(size_t i) const; virtual bool IsNull(size_t i) const; virtual const std::vector& ValidData() const; }; ``` ## Scalar type aliases ```cpp using BoolFieldData = FieldData; using Int8FieldData = FieldData; using Int16FieldData = FieldData; using Int32FieldData = FieldData; using Int64FieldData = FieldData; using FloatFieldData = FieldData; using DoubleFieldData = FieldData; using VarCharFieldData = FieldData; using JSONFieldData = FieldData; using GeometryFieldData = VarCharFieldData; // geometry passed as WKT string using TimestamptzFieldData = VarCharFieldData; // timestamptz passed as ISO-8601 string ``` ## Vector type aliases ```cpp using FloatVecFieldData = FieldData, DataType::FLOAT_VECTOR>; using Float16VecFieldData = FieldData, DataType::FLOAT16_VECTOR>; using BFloat16VecFieldData = FieldData, DataType::BFLOAT16_VECTOR>; using Int8VecFieldData = FieldData, DataType::INT8_VECTOR>; using SparseFloatVecFieldData = FieldData, DataType::SPARSE_FLOAT_VECTOR>; // BinaryVecFieldData is a derived class (not a plain alias) with extra helpers ``` `BinaryVecFieldData` extends `FieldData, DataType::BINARY_VECTOR>` and adds string-based convenience methods: `AddAsString()`, `DataAsString()`, and static helpers `ToBinaryStrings()` / `ToBinaryString()` / `ToUnsignedChars()`. ## Array type aliases ```cpp using ArrayBoolFieldData = ArrayFieldData; using ArrayInt8FieldData = ArrayFieldData; using ArrayInt16FieldData = ArrayFieldData; using ArrayInt32FieldData = ArrayFieldData; using ArrayInt64FieldData = ArrayFieldData; using ArrayFloatFieldData = ArrayFieldData; using ArrayDoubleFieldData = ArrayFieldData; using ArrayVarCharFieldData= ArrayFieldData; using StructFieldData = ArrayFieldData; ``` `ArrayFieldData` extends `FieldData, DataType::ARRAY>` and stores each entity row as a `std::vector`. ## Shared-pointer aliases Every concrete type has a corresponding `*Ptr` alias, e.g.: ```cpp using BoolFieldDataPtr = std::shared_ptr; using Int64FieldDataPtr = std::shared_ptr; using FloatVecFieldDataPtr= std::shared_ptr; // ... and so on for all types above ``` ## Example ```cpp #include using namespace milvus; // Build column-based data and insert auto id_col = std::make_shared("id"); auto vec_col = std::make_shared("vec"); for (int64_t i = 0; i < 100; ++i) { id_col->Add(i); vec_col->Add(std::vector(128, static_cast(i) / 100.0f)); } auto client = MilvusClientV2::Create(); client->Connect(ConnectParam("http://localhost:19530").WithToken("root:Milvus")); InsertResponse resp; client->Insert( InsertRequest() .WithCollectionName("my_collection") .WithColumnsData({id_col, vec_col}), resp); // Read field data from query results QueryResponse qresp; client->Query( QueryRequest() .WithCollectionName("my_collection") .WithFilter("id < 10") .AddOutputField("id") .AddOutputField("vec"), qresp); auto id_data = std::dynamic_pointer_cast( qresp.Results().OutputField("id")); auto vec_data = std::dynamic_pointer_cast( qresp.Results().OutputField("vec")); for (size_t i = 0; i < id_data->Count(); ++i) { std::cout << "id=" << id_data->Value(i) << " vec[0]=" << vec_data->Value(i)[0] << "\n"; } ```