我在OrientDB中有这样的结构,其中每个节点都是user_id所代表的特定用户,所有购买信息都保存在嵌入式列表中,如下所示。
[
{
"user_id": 1,
"purchase_info": [ {
"product_id": 100,
"timestamp": "2016-04-26 01:50:00"
},
{
"product_id": 200,
"timestamp": "2016-04-26 10:50:00"
}
]
},
{
"user_id": 2,
"purchase_info": [ {
"product_id": 100,
"timestamp": "2016-04-26 10:50:00"
},
{
"product_id": 300,
"timestamp": "2016-04-26 20:50:00"
}
]
},
{
"user_id": 3,
"purchase_info": [ {
"product_id": 100,
"timestamp": "2016-04-26 04:50:00"
}
]
},
{
"user_id": 4,
"purchase_info": [ {
"product_id": 300,
"timestamp": "2016-04-26 05:50:00"
}
]
}
]
现在,我想查找在特定日期时间范围内购买产品的用户。
例如,如果日期时间范围介于2016-04-26 01:00:00和2016-04-26 04:55:00之间,则返回的结果将为user_id 1和3.
我知道要查询嵌入式列表,我们需要使用WHERE <value> IN <key name>
。但是,我找不到使用该格式的范围的方法。
对于时间戳的非范围查询,也无法使用asDateTime()
。
例如,此查询不返回任何内容:
SELECT from V where "2016-04-26 01:50:00" in purchase_info.timestamp.asDateTime()
答案 0 :(得分:1)
试试这个:
select user_id,date from (select user_id,purchase_info.timestamp as date from User unwind date) where date between "2016-04-26 01:00:00" and "2016-04-26 04:55:00"
结果:
希望它有所帮助。
答案 1 :(得分:0)
这不是使用OrientDB的最佳方式。
如果您按照上面的建议更改模型,则可以执行以下查询:
select expand( inV() )
from purchase
where date between "2016-04-26 01:00:00" and "2016-04-26 04:55:00"
获取以该间隔购买的所有用户,并且:
select expand( outV() )
from purchase
where date between "2016-04-26 01:00:00" and "2016-04-26 04:55:00"
在该间隔内获得所有产品。
要获得良好的性能,请记住使用NOTUNIQUE索引索引边缘“Purchase”中的日期字段。