如何在OrientDB中获取JSON格式而非对象的分组关联数据
解决OrientDB MATCH查询分组后仅返回记录ID的问题
嘿,我明白你遇到的问题了!刚接触OrientDB的时候确实容易踩这种小坑——你现在的查询里用CONCAT(sku),OrientDB会默认返回SKU记录的RID(就是那些#xxx:xxx格式的ID),而不是你想要的SKU具体属性值。
问题根源
当你直接在聚合函数里使用记录变量(比如sku)时,OrientDB不会自动提取它的属性,而是返回该记录的唯一标识符RID。要拿到实际的SKU数据,你需要明确指定要聚合的具体字段,比如SKU的名称、编码或者其他你需要的属性。
修正后的查询示例
根据你的需求,这里提供几种可行的写法:
1. 收集SKU属性为列表(推荐,可读性强)
如果只是想把每个子分类下的SKU属性整理成列表,用LIST()聚合函数:
MATCH {class: SKU, as: sku}-categorizedIn-> {class:Category, as: subcat}<-hasSubcategory-{class: Category, as: cat, where: (name='Drinks')} RETURN subcat.name, LIST(sku.name) AS sku_names GROUP BY subcat.name
把sku.name换成你实际需要的SKU字段(比如sku.code、sku.id)即可。
2. 拼接SKU属性为字符串
如果需要用逗号把SKU属性拼接成单个字符串,OrientDB 3.0及以上版本可以用CONCAT_AGG():
MATCH {class: SKU, as: sku}-categorizedIn-> {class:Category, as: subcat}<-hasSubcategory-{class: Category, as: cat, where: (name='Drinks')} RETURN subcat.name, CONCAT_AGG(sku.name, ', ') AS sku_names GROUP BY subcat.name
如果你的OrientDB版本较低(低于3.0),可以用LIST()配合JOIN()来实现拼接:
MATCH {class: SKU, as: sku}-categorizedIn-> {class:Category, as: subcat}<-hasSubcategory-{class: Category, as: cat, where: (name='Drinks')} RETURN subcat.name, JOIN(LIST(sku.name), ', ') AS sku_names GROUP BY subcat.name
验证结果
修改后执行查询,返回的sku_names列就会显示你指定的SKU属性,而不再是RID了。
内容的提问来源于stack exchange,提问作者Gijs Beijer
相关产品推荐
相关产品推荐

