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().

// 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<Field>;

// Template class
template <typename T, DataType Dt>
class FieldData : public Field {
    explicit FieldData(std::string name);
    FieldData(std::string name, const std::vector<T>& data);
    FieldData(std::string name, const std::vector<T>& data, const std::vector<bool>& valid_data);

    StatusCode Add(const T& element);
    StatusCode AddNull();
    StatusCode Append(const std::vector<T>& elements);
    size_t Count() const;
    void Reserve(size_t count);
    virtual const std::vector<T>& Data() const;
    virtual T Value(size_t i) const;
    virtual bool IsNull(size_t i) const;
    virtual const std::vector<bool>& ValidData() const;
};

Scalar type aliases

using BoolFieldData        = FieldData<bool,             DataType::BOOL>;
using Int8FieldData        = FieldData<int8_t,           DataType::INT8>;
using Int16FieldData       = FieldData<int16_t,          DataType::INT16>;
using Int32FieldData       = FieldData<int32_t,          DataType::INT32>;
using Int64FieldData       = FieldData<int64_t,          DataType::INT64>;
using FloatFieldData       = FieldData<float,            DataType::FLOAT>;
using DoubleFieldData      = FieldData<double,           DataType::DOUBLE>;
using VarCharFieldData     = FieldData<std::string,      DataType::VARCHAR>;
using JSONFieldData        = FieldData<nlohmann::json,   DataType::JSON>;
using GeometryFieldData    = VarCharFieldData;   // geometry passed as WKT string
using TimestamptzFieldData = VarCharFieldData;   // timestamptz passed as ISO-8601 string

Vector type aliases

using FloatVecFieldData       = FieldData<std::vector<float>,                  DataType::FLOAT_VECTOR>;
using Float16VecFieldData     = FieldData<std::vector<uint16_t>,               DataType::FLOAT16_VECTOR>;
using BFloat16VecFieldData    = FieldData<std::vector<uint16_t>,               DataType::BFLOAT16_VECTOR>;
using Int8VecFieldData        = FieldData<std::vector<int8_t>,                 DataType::INT8_VECTOR>;
using SparseFloatVecFieldData = FieldData<std::map<uint32_t, float>,           DataType::SPARSE_FLOAT_VECTOR>;
// BinaryVecFieldData is a derived class (not a plain alias) with extra helpers

BinaryVecFieldData extends FieldData<std::vector<uint8_t>, DataType::BINARY_VECTOR> and adds string-based convenience methods: AddAsString(), DataAsString(), and static helpers ToBinaryStrings() / ToBinaryString() / ToUnsignedChars().

Array type aliases

using ArrayBoolFieldData   = ArrayFieldData<bool,        DataType::BOOL>;
using ArrayInt8FieldData   = ArrayFieldData<int8_t,      DataType::INT8>;
using ArrayInt16FieldData  = ArrayFieldData<int16_t,     DataType::INT16>;
using ArrayInt32FieldData  = ArrayFieldData<int32_t,     DataType::INT32>;
using ArrayInt64FieldData  = ArrayFieldData<int64_t,     DataType::INT64>;
using ArrayFloatFieldData  = ArrayFieldData<float,       DataType::FLOAT>;
using ArrayDoubleFieldData = ArrayFieldData<double,      DataType::DOUBLE>;
using ArrayVarCharFieldData= ArrayFieldData<std::string, DataType::VARCHAR>;
using StructFieldData      = ArrayFieldData<nlohmann::json, DataType::STRUCT>;

ArrayFieldData<T, Et> extends FieldData<std::vector<T>, DataType::ARRAY> and stores each entity row as a std::vector<T>.

Shared-pointer aliases

Every concrete type has a corresponding *Ptr alias, e.g.:

using BoolFieldDataPtr    = std::shared_ptr<BoolFieldData>;
using Int64FieldDataPtr   = std::shared_ptr<Int64FieldData>;
using FloatVecFieldDataPtr= std::shared_ptr<FloatVecFieldData>;
// ... and so on for all types above

Example

#include <milvus/MilvusClientV2.h>
using namespace milvus;

// Build column-based data and insert
auto id_col  = std::make_shared<Int64FieldData>("id");
auto vec_col = std::make_shared<FloatVecFieldData>("vec");
for (int64_t i = 0; i < 100; ++i) {
    id_col->Add(i);
    vec_col->Add(std::vector<float>(128, static_cast<float>(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<Int64FieldData>(
    qresp.Results().OutputField("id"));
auto vec_data = std::dynamic_pointer_cast<FloatVecFieldData>(
    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";
}

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
Feedback

Was this page helpful?