MongoDB:查询引用文档的字段
我正在写一个Flask应用程序,用来报告与内容项目相关的不同指标(比如浏览次数)。这些指标数据是从各种来源导入的,我使用MongoDB在本地存储这些数据。在Flask中,我用MongoEngine来查询这些数据。
数据结构如下:
每个'指标数据'文档都关联一个'指标'和一个'内容实例'(也就是说,一个指标可以有很多指标数据,一个内容实例也可以有很多指标数据)——下面是mongo shell中一个'metric_data'文档的例子:
{
"_id" : ObjectId("536b05fc182aff24ca916c22"),
"metric" : ObjectId("536ae244182aff1f222f00c7"),
"content_instance" : ObjectId("536adcef182aff1e73d6e021"),
...
}
每个'内容实例'文档都关联一个'类别'和一个'来源'(也就是说,一个类别可以有很多内容实例,一个来源也可以有很多内容实例)——下面是mongo shell中一个'content_instance'文档的例子:
{
"_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)
这样查询可以吗?特别是,我担心从一个查询中返回的内容实例文档数量,以及将这些作为参数传递给另一个查询——到目前为止,我的测试数据有限,cont_inst_list
的长度已经是147了。对此有什么建议我会非常感激。
1 个回答
使用嵌入文档字段(EmbeddedDocumentField)和嵌入文档(EmbeddedDocument),你可以像在Django ORM中那样进行查询。
举个例子,看看这个链接:在MongoEngine中过滤嵌入列表