我正在撰写一个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'文档的一个例子:< / p>
{
"_id" : ObjectId("536adcef182aff1e73d6e043"),
"category" : ObjectId("5369c352182aff28cf18e912"),
"source" : ObjectId("5369c384182aff28cf18e914"),
...
}
我需要按指标,来源和类别查询指标数据。我知道我不能做连接,并且需要多个查询。我只是想确认我正在使用的查询是否适合这个用例,并且没有其他更有效,更可扩展的方法来做同样的事情(这不是更复杂)。
如果我使用常规的RDBMS和常规的Python ORM(例如Django),我可以这样做(但它不适用于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.任何关于此的建议非常感谢。
答案 0 :(得分:0)
使用EmbeddedDocumentField和EmbeddedDocument,您可以执行类似于Django ORM的查询。