【发布时间】:2014-05-09 05:48:18
【问题描述】:
我正在编写一个 Flask 应用程序,它报告与内容项相关的不同指标(例如视图数量)。指标数据是从各种来源导入的,我使用 MongoDB 将其存储在本地。我正在使用 Flask 中的 MongoEngine 查询它。
数据结构如下:
每个 'MetricData' 文档都引用一个 'Metric' 和一个 'ContentInstance' (即一个 Metric 有许多 MetricData,一个 ContentInstance 有许多 MetricData) - 这是 mongo shell 中的一个 'metric_data' 文档的示例:
{
"_id" : ObjectId("536b05fc182aff24ca916c22"),
"metric" : ObjectId("536ae244182aff1f222f00c7"),
"content_instance" : ObjectId("536adcef182aff1e73d6e021"),
...
}
每个“ContentInstance”文档都引用了一个“Category”和一个“Source”(即一个 Category 有很多 ContentInstance,一个 Source 有很多 ContentInstance)——这是 mongo shell 中的一个“content_instance”文档的示例:
{
"_id" : ObjectId("536adcef182aff1e73d6e043"),
"category" : ObjectId("5369c352182aff28cf18e912"),
"source" : ObjectId("5369c384182aff28cf18e914"),
...
}
我需要按指标、来源和类别查询指标数据。我知道我不能进行连接,并且需要多个查询。我只是想确认我正在使用的查询是否适合这个用例,并且没有另一种更有效、更可扩展的方式来做同样的事情(这并不复杂)。
如果我使用带有常规 Python ORM(例如 Django)的常规 RDBMS,我可以这样做(但它不适用于 MongoDB / MongoEngine):
md_list = MetricData.objects.filter(metric__title__in=(
'Number of views', 'Awesomeness'),
content_instance__source__title__in=(
'Google', 'Facebook'),
content_instance__category__title__in=(
'Apples', 'Oranges'))
这是我现在正在做的事情,使用 MongoEngine(注意:按标题过滤只是一个示例,实际过滤是基于用户的查询):
metric_list = Metric.objects.filter(title__in=('Number of views', 'Awesomeness'))
source_list = Source.objects.filter(title__in=('Google', 'Facebook'))
cat_list = Category.objects.filter(title__in=('Apples', 'Oranges'))
cont_inst_list = ContentInstance.objects.filter(source__in=source_list,
category__in=cat_list)
md_list = MetricData.objects.filter(metric__in=metric_list,
content_instance__in=cont_inst_list)
这样查询可以吗?特别是,我担心我从一个查询返回多少 ContentInstance 文档并将其作为参数传递给另一个 - 到目前为止,我的测试数据有限,cont_inst_list 的长度已经是 147。有关此的任何建议都是非常感谢。
【问题讨论】:
标签: python mongodb flask mongoengine