Nosql 如何使用对象数组过滤google数据存储实体

Nosql 如何使用对象数组过滤google数据存储实体,nosql,google-cloud-datastore,Nosql,Google Cloud Datastore,给定一个数据存储实体结构,其中一列(日期)包含一个对象数组: [{date: 2018-01-01T00:00:00Z, otherProps:x }, {date: 2018-01-02T00:00:00Z, otherProps: x}, {date: 2017-12-31T00:00:00Z, otherProps: x}] 是否可以在entities dates数组中构建一个复杂的索引和一个关于最早日期的查询 例如,我想选择最早日期在某个日期之前的所有实体。。。这是我第一次涉足NoSQ

给定一个数据存储实体结构,其中一列(日期)包含一个对象数组:

[{date: 2018-01-01T00:00:00Z, otherProps:x }, {date: 2018-01-02T00:00:00Z, otherProps: x}, {date: 2017-12-31T00:00:00Z, otherProps: x}]
是否可以在entities dates数组中构建一个复杂的索引和一个关于最早日期的查询


例如,我想选择最早日期在某个日期之前的所有实体。。。这是我第一次涉足NoSQL,如果这是显而易见的,我深表歉意

这可能很棘手,因为查询排序和筛选通常基于属性值,在您的情况下,这些值将是整个日期数组,而不仅仅是其中的日期值

根据您使用的实际客户端库,这可能是可能的。例如,请参见
ndb
客户端库


就我个人而言,我更愿意为这些日期数组中的每一个创建单独的实体,将
date
otherProps
作为属性-在查询中用作排序/筛选要简单得多。一般来说,更具可扩展性的方法是IMHO,因为它避免了(重复的)日期数组属性列表,请参见。

您可以通过使用
arrayName.date
简单地在查询中引用元素。这将起作用,因为索引不是复合索引,这意味着您没有尝试过滤类似于
yourKind.property=value和arrayName.date
的内容


我强烈建议您不要将日期保存为字符串,而是使用时间戳(如javascript(new date()).getTime()),这将使在长时间的therm中更加容易,主要是当您使用多个时区时。

数据存储架构不是我的,我目前没有将日期更改为时间戳的选项,虽然它们是ISO8601,我认为它的设计是为了让像<这样的字符串比较器能够工作。。。虽然不确定时区位是否正确,但我使用的是Node-googledartastorejs库()。这些是来自firebase的存档记录,其中多个日期作为对象上的键更有意义,因此,虽然我可以在存档记录时更改结构,但我希望不仅仅是为了方便活动记录和存档记录之间的奇偶性。。。下面是指向结构化属性的链接,我看到了,但这仅在python库中可用吗?看起来可能就是您要查找的:
注意:索引时,您可以查询子属性
。但我不知道这些是怎么用的。