在同一个 POST 请求中生成不同集合中的多个对象 (Python-Eve)
Generate multiple objects in different collections in same POST request (Python-Eve)
我们有一个实体 "robot"。
每个机器人都有一个起点、当前位置以及名称、型号等其他属性...
Position 是一个 http://geojson.org/ 点,并且具有更多属性,例如 slope_level 和地形。
我们想使用地理查询,以便查询机器人位置(和起点),所以我们需要一个索引 2dsphere(如本问题this question中所述)。
解决问题的方法
使用Python-Eve,设计一个像这样的域:
DOMAIN = {
'robot': {
'item_title': 'robot',
'url': 'robot',
'schema': {
'name': {
'type': 'string',
'required': True,
},
'start_point': {
'type': 'objectid',
'data_relation': {
'resource': 'geopoints',
'field': '_id',
'embeddable': True
}
},
'current_point': {
'type': 'objectid',
'data_relation': {
'resource': 'geopoints',
'field': '_id',
'embeddable': True
}
}
}
},
'geopoints': {
'item_title': 'geopoints',
'url': 'geopoints',
'schema': {
'terrain': {
'type': 'string',
},
'slope_level': {
'type': 'string',
},
'location': {
'type': 'point'
}
}
}
}
在这种情况下,我们有两个集合,一个包含地理点,另一个包含机器人。 geopoint 有其 "location" 2dsphere 索引,以便 运行 geojson 查询。
如果我们想创建一个新的机器人,我们需要先创建地理点 "start_point",然后创建机器人,将地理点 ID 作为参数发送。
有没有办法在同一个请求中发送一个包含 start_point 嵌入对象的机器人,然后告诉 Python-Eve 使用 "start_point" 新对象,创建一个带有此数据的地理点,以及 link 机器人的 start_point ID? (我知道如果你从头开始可以手动完成,但我想知道是否可以使用 Python-Eve 框架)。
这是不是一个糟糕的设计,我只需要一个将 start_point 作为对象嵌入的集合,而不是作为一个独立的集合? (所以在同一个请求中,我们准备好了对象)。
是否有任何方法pro/con?
我想说,如果您的地理点将以某种方式被其他 robots/resources 重新使用,那么将单个机器人数据分成两个集合最终是有意义的,这似乎不太可能。
然而,即便如此,考虑到您在减少 storage/index space 方面获得的(非常)小的优势,我想知道这是否有意义,因为您可以查询您的 geopoints/terrain/etc。即使每个机器人都存储了这种数据(您仍然可以找到位于同一位置的所有机器人)。此外,请考虑由于在 robot
端点添加双嵌入而导致的性能损失。
所以真正的问题是,将机器人数据分成两个集合而增加的复杂性真的值得吗?
我们有一个实体 "robot"。
每个机器人都有一个起点、当前位置以及名称、型号等其他属性...
Position 是一个 http://geojson.org/ 点,并且具有更多属性,例如 slope_level 和地形。
我们想使用地理查询,以便查询机器人位置(和起点),所以我们需要一个索引 2dsphere(如本问题this question中所述)。
解决问题的方法
使用Python-Eve,设计一个像这样的域:
DOMAIN = {
'robot': {
'item_title': 'robot',
'url': 'robot',
'schema': {
'name': {
'type': 'string',
'required': True,
},
'start_point': {
'type': 'objectid',
'data_relation': {
'resource': 'geopoints',
'field': '_id',
'embeddable': True
}
},
'current_point': {
'type': 'objectid',
'data_relation': {
'resource': 'geopoints',
'field': '_id',
'embeddable': True
}
}
}
},
'geopoints': {
'item_title': 'geopoints',
'url': 'geopoints',
'schema': {
'terrain': {
'type': 'string',
},
'slope_level': {
'type': 'string',
},
'location': {
'type': 'point'
}
}
}
}
在这种情况下,我们有两个集合,一个包含地理点,另一个包含机器人。 geopoint 有其 "location" 2dsphere 索引,以便 运行 geojson 查询。
如果我们想创建一个新的机器人,我们需要先创建地理点 "start_point",然后创建机器人,将地理点 ID 作为参数发送。
有没有办法在同一个请求中发送一个包含 start_point 嵌入对象的机器人,然后告诉 Python-Eve 使用 "start_point" 新对象,创建一个带有此数据的地理点,以及 link 机器人的 start_point ID? (我知道如果你从头开始可以手动完成,但我想知道是否可以使用 Python-Eve 框架)。
这是不是一个糟糕的设计,我只需要一个将 start_point 作为对象嵌入的集合,而不是作为一个独立的集合? (所以在同一个请求中,我们准备好了对象)。
是否有任何方法pro/con?
我想说,如果您的地理点将以某种方式被其他 robots/resources 重新使用,那么将单个机器人数据分成两个集合最终是有意义的,这似乎不太可能。
然而,即便如此,考虑到您在减少 storage/index space 方面获得的(非常)小的优势,我想知道这是否有意义,因为您可以查询您的 geopoints/terrain/etc。即使每个机器人都存储了这种数据(您仍然可以找到位于同一位置的所有机器人)。此外,请考虑由于在 robot
端点添加双嵌入而导致的性能损失。
所以真正的问题是,将机器人数据分成两个集合而增加的复杂性真的值得吗?