【问题标题】:MongoDB: querying fields of a referenced documentMongoDB:查询引用文档的字段
【发布时间】: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


    【解决方案1】:

    使用 EmbeddedDocumentField 和 EmbeddedDocument,您可以像 Django ORM 一样进行查询。

    例如Filtering an embedded list in MongoEngine

    【讨论】:

    • 很高兴知道...但是我没有使用 EmbeddedDocument,只是具有参考字段的不同文档模型。我需要根据许多不同的维度查询指标数据,数据不能很好地嵌入到一个特定的集合中......所以 EmbeddedDocument 不是我的选择。我在问我正在做的是否是正确的方法,因为它们是带有引用的不同顶级集合。
    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 2017-09-13
    • 2019-07-11
    • 2018-12-01
    • 2018-06-04
    • 2017-01-27
    • 2014-10-12
    • 1970-01-01
    相关资源
    最近更新 更多