Java OrientDB集合扩展和分组

Java OrientDB集合扩展和分组,java,orientdb,Java,Orientdb,我的数据库中有以下类: 商品{name:String,price:Double,…} 订单规格{goods1-1:链接,数量:双} 订单{spec1-*:链接列表,日期:日期,…} 然后,我必须从具有特定日期的订单中选择所有商品,对其进行分组,并进行一些合计,例如,每种商品的数量总和。在stadard SQL DB中,我会进行一些连接,按日期过滤,按商品id分组,但我不知道如何在OrientDB中实现这一点。我从 select expand(spec) from Order where date

我的数据库中有以下类:

商品{name:String,price:Double,…} 订单规格{goods1-1:链接,数量:双} 订单{spec1-*:链接列表,日期:日期,…} 然后,我必须从具有特定日期的订单中选择所有商品,对其进行分组,并进行一些合计,例如,每种商品的数量总和。在stadard SQL DB中,我会进行一些连接,按日期过滤,按商品id分组,但我不知道如何在OrientDB中实现这一点。我从

select expand(spec) from Order where date = "..."
但当我添加分组时:

select expand(spec) from Order group by spec.goods
结果是空的

一般来说,我希望找到以下SQL查询的等价项:

select goods_id, goods_name, sum(order_spec_quantity), sum(goods_price) from Order
    left join OrderSpec on order_id = order_spec_order_id
    left join Goods on goods_id = order_spec_goods_id
where date = 'some date'
group by goods_id, goods_name

使用OrientDB,您可以选择Graph DB,直接使用顶点和边从数据库中删除PK和FK字段。 我创建了一个包含代码和查询的示例:

create class Goods extends V;
create property Goods.id integer;
create property Goods.name String;

create property Goods.price double;
create property Goods.description String;

create class Order extends V;
create property Order.id integer;
create property Order.dateorder date;
create property Order.country String;

create class orderSpec extends E;
create property orderSpec.quantity integer;

insert into Goods(id,name,price,description) values (1,"oven",260.5,"kitchen");
insert into Goods(id,name,price,description) values (2,"television",300.7,"sitting room");
insert into Goods(id,name,price,description) values (3,"bed",100.3,"bedroom");
insert into Goods(id,name,price,description) values (4,"table",120.4,"dining room");

insert into Order(id,dateorder,country) values (1,"2013-04-12","UK");
insert into Order(id,dateorder,country) values (2,"2014-07-12","Germany");
insert into Order(id,dateorder,country) values (3,"2014-07-12","UK");

create edge orderSpec from (select from Order where id=1) to (select from Goods where id=1) set quantity = 2;
create edge orderSpec from (select from Order where id=1) to (select from Goods where id=2) set quantity = 3;
create edge orderSpec from (select from Order where id=1) to (select from Goods where id=3) set quantity = 2;
create edge orderSpec from (select from Order where id=2) to (select from Goods where id=2) set quantity = 1;
create edge orderSpec from (select from Order where id=3) to (select from Goods where id=2) set quantity = 1;
create edge orderSpec from (select from Order where id=3) to (select from Goods where id=4) set quantity = 2;
这是图表:

现在,您可以通过使用顶点之间的直接链接,查询数据库以获取所有信息,而无需执行连接操作

按文章筛选:

按日期筛选:


使用OrientDB,您可以选择Graph DB,直接使用顶点和边从数据库中删除PK和FK字段。 我创建了一个包含代码和查询的示例:

create class Goods extends V;
create property Goods.id integer;
create property Goods.name String;

create property Goods.price double;
create property Goods.description String;

create class Order extends V;
create property Order.id integer;
create property Order.dateorder date;
create property Order.country String;

create class orderSpec extends E;
create property orderSpec.quantity integer;

insert into Goods(id,name,price,description) values (1,"oven",260.5,"kitchen");
insert into Goods(id,name,price,description) values (2,"television",300.7,"sitting room");
insert into Goods(id,name,price,description) values (3,"bed",100.3,"bedroom");
insert into Goods(id,name,price,description) values (4,"table",120.4,"dining room");

insert into Order(id,dateorder,country) values (1,"2013-04-12","UK");
insert into Order(id,dateorder,country) values (2,"2014-07-12","Germany");
insert into Order(id,dateorder,country) values (3,"2014-07-12","UK");

create edge orderSpec from (select from Order where id=1) to (select from Goods where id=1) set quantity = 2;
create edge orderSpec from (select from Order where id=1) to (select from Goods where id=2) set quantity = 3;
create edge orderSpec from (select from Order where id=1) to (select from Goods where id=3) set quantity = 2;
create edge orderSpec from (select from Order where id=2) to (select from Goods where id=2) set quantity = 1;
create edge orderSpec from (select from Order where id=3) to (select from Goods where id=2) set quantity = 1;
create edge orderSpec from (select from Order where id=3) to (select from Goods where id=4) set quantity = 2;
这是图表:

现在,您可以通过使用顶点之间的直接链接,查询数据库以获取所有信息,而无需执行连接操作

按文章筛选:

按日期筛选:


请尝试以下查询

select myRid,myName,sum,eval("myPrice * sum") as totalPrice from (select myRid,myName,sum(myQuantity) as sum,myPrice from (select spec.goods.@rid as myRid,spec.goods.name as myName,spec.quantity as myQuantity, spec.goods.price as myPrice from (select spec from Order where date = 'some date' unwind spec )) group by myRid,myName)

请尝试以下查询

select myRid,myName,sum,eval("myPrice * sum") as totalPrice from (select myRid,myName,sum(myQuantity) as sum,myPrice from (select spec.goods.@rid as myRid,spec.goods.name as myName,spec.quantity as myQuantity, spec.goods.price as myPrice from (select spec from Order where date = 'some date' unwind spec )) group by myRid,myName)

能否指定OrderSpec和Order的字段类型?OrderSpec和Order是顶点还是文档?谢谢你的评论,我在帖子中添加了字段类型。所有实体都是文档。抱歉@Aeteros,但是文档订单的字段spec1-*是链接或链接列表?您可以指定OrderSpec和Order的字段类型吗?OrderSpec和Order是顶点还是文档?谢谢你的评论,我在帖子中添加了字段类型。所有实体都是文档。抱歉@Aeteros,但文档订单的字段spec1-*是链接或链接列表?感谢如此详细的aswer,但它不包括分组。此外,我的数据库使用文档,它是否可以与in和out方法一起使用?在这里,您可以找到一个GROUP BY的示例:select article,sumid from select out'orderSpec'。name as article,id,dateorder from Order unwind article GROUP BY article对于第二个问题,如果要使用in和out函数遍历图的边缘,则必须使用Graph DB类型。感谢您提供如此详细的aswer,但它不包括分组。此外,我的数据库使用文档,它是否可以与in和out方法一起使用?在这里,您可以找到一个GROUP BY的示例:select article,sumid from select out'orderSpec'。name as article,id,dateorder from Order unwind article GROUP BY article对于第二个问题,如果要使用in和out函数通过边遍历图形,则必须使用Graph DB类型。