假设以下是我在Google云平台上的数据存储内容:
class ItemRecord {
@Id
private
Long id;
@Index
private String item;
@Index
private String user;
@Index
private int minValue;
@Index
private int maxValue;
}
我希望得到minValue
组的maxValue
和item
值的最小值:
item1 minumum_minValue= 1, maximum_maxValue= 13
item2 minumum_minValue= 3, maximum_maxValue= 10
注意: minValue和maxValue属性是可更新的(实体是用户给定的值,用户可以随时更新这些属性)所以请考虑更新,删除操作建议使用单独的实体存储最小值minValue
和最多maxValue
值。
我正在寻找类似sql:
的内容SELECT item, MAX(maxValue)
FROM [ItemRecord]
Group by item
和
SELECT item, MIN(minValue)
FROM [ItemRecord]
Group by item
但数据存储不支持" group by"操作,我找不到类似的东西。
那么,我是如何解决这个问题的?
1)获取不同的项目名称:
private static List<String> getDistinctItemNameList() {
Query query = ofy().load().type(ItemRecord.class)
.project("item").distinct(true);
List<ItemRecord> resultList = query.list();
if(resultList != null && !resultList.isEmpty()) {
List<String> itemNameList = new ArrayList<>(resultList.size());
for (ItemRecord itemRecord : resultList) {
itemNameList.add(itemRecord.getItem());
}
return itemNameList;
}
return null;
}
2)对于每个itemName(在上面检索)查询数据存储区的最小minValue和最大maxValue:
private ItemRecord getMinumumMinValue(String itemName) {
ItemRecord record = ofy()
.load()
.type(ItemRecord.class)
.filter("item", itemName)
.order("minValue")
.first().now();
return record;
}
private ItemRecord getMaximumMaxValue(String itemName) {
ItemRecord record = ofy()
.load()
.type(ItemRecord.class)
.filter("item", itemName)
.order("-maxValue")
.first().now();
return record;
}
费用(用于检索不同商品名称的查询)+(不同商品数*最小minValue查询)+(不同商品数*最大maxValue查询)
但是这个解决方案因其许多读取操作而非常烦人。你有什么建议,更好的解决方案吗?
答案 0 :(得分:2)
数据存储区是分析查询的糟糕工具。将您的数据子集复制到Cloud SQL或其他可以轻松运行聚合的关系存储中。