MongoDB:查询引用文档的字段

时间:2014-05-09 05:48:19

标签: python mongodb flask mongoengine

我正在撰写一个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.任何关于此的建议非常感谢。

1 个答案:

答案 0 :(得分:0)

使用EmbeddedDocumentField和EmbeddedDocument,您可以执行类似于Django ORM的查询。

示例Filtering an embedded list in MongoEngine