我正在使用sprigboot和influx客户端:https://github.com/influxdata/influxdb-java

我遇到一个问题,我试图从influx数据库中获取specif列,但是当我将列名放入查询中时却无法获取任何记录。但是,当我尝试使用select *时,我正在获取数据。

@Data
@Measurement(name = "layout")
public class LayoutMapper {

    @Column(name = "id", tag=true)
    private String id;

    @Column(name = "linename", tag=true)
    private String lineName;

    @Column(name = "tenantid")
    private String tenantName;

    @Column(name = "layout")
    private String layout;



}


要将POJO保存到数据库:

Point point = Point.measurementByPOJO(clazz.getClass()).addFieldsFromPOJO(pojoObject).build();
            connection.query(new Query("CREATE RETENTION POLICY " + retentionPolicyName + " ON " + dbProperties.getDatabase() DURATION 1h  REPLICATION 1 DEFAULT"));
            connection.write(dbProperties.getDatabase(), retentionPolicyName, point);


工作方式:

  select * from layout;
  select layout from layout;


不起作用(提供空记录):

select linename from layout;


谁能暗示我在做什么错?

注意:观察它很奇怪,我们不能对字符串列选择查询有任何建议?

最佳答案

我认为influxdb-java客户端库创建用于访问数据的抽象的方法有点令人困惑。首先,这些列实际上都不是列。在InfluxDB中,您的数据使用以下数据模型(也称为线路协议)存储:measurement-name,tag-set field-set timestamp

“度量”是高级别的数据分组,它是字符串,“标签集”是键/值对的集合,可以将其视为对所有值进行索引和字符串化的元数据,而“字段集”是键/值对的集合,其中值可以是int64,float64,bool或string。与标签相比,字段未编制索引。

LayoutMapper类中,为tag=trueid设置linename,这意味着这两个是测量中标记集的成员。标签用于以高性能方式查询字段。因此,它们通常位于WHERE子句中,而不是单独位于SELECT中。

在InfluxDB中,如果要返回特定标签,则SELECT子句必须至少包含一个字段。这就是为什么您只能从包括*layout字段的查询中获得结果的原因。总而言之,请尝试以下操作:

SELECT layout, linename FROM layout;

07-25 21:35
查看更多