【问题标题】:mongoDB references fetching takes timemongoDB 引用获取需要时间
【发布时间】:2013-04-13 17:17:40
【问题描述】:

我使用 mongoengine 作为对象文档映射器。以下是导致问题的集合的简要说明。集合 A 中的每个文档都可以包含对集合 B 中文档的引用列表。

class A(Document): 
    list_b = ListField(EmbeddedDocumentField(EB))
    #other fields are not mentioned.

class EB(EmbeddedDocument):
    b_reference = ReferenceField('B')
    loc = GeoPointField()

class B(Document):
    name = StringField()
    #other fields are not mentioned.

当我尝试使用

访问特定文档的列表对象时

document_of_A.list_b

上述行的执行时间取决于列表中存在的引用数。例如。列表中的 100 个引用需要 100 毫秒。

有没有更好的方法来获取引用?,从而减少上述行的执行时间。

【问题讨论】:

  • 欢迎迎接 MongoDb 文档组织的挑战。 :) docs.mongodb.org/manual/core/data-modeling 您需要所有参考文件吗?
  • 是否对文档B 的引用进行了索引,以便可以一次返回对与A 相关的文档的请求?
  • 不,'list_b' 字段上没有索引。
  • 如果它们没有被索引,MongoDB 可能需要搜索每个文档以寻找匹配项。
  • 创建索引后也没有变化。

标签: mongodb optimization pymongo mongoengine


【解决方案1】:

如果要快速获取所有引用,则在查询时应使用select_related 标志。请注意参考查找将花费额外的查询,select_related() 旨在减少往返 mongodb 的次数。

# Single document lookup
document_of_A.select_related(2)

# Queryset
A.objects.select_related(2)

为什么选择 2 用于 select_related 查找?那么递归深度是:

  1. 在列表本身中查找所有引用
  2. 在各个嵌入文档中查找参考文献

【讨论】:

  • 当我使用 select_related(2) 作为查询的一部分时,查询时间是相同的,但是当我尝试获取引用时没有实现优化。其中,当我将 select_related(2) 用作单个文档的一部分时,可以节省参考时间,但现在 select_related(2) 部分需要时间。
  • 啊,也许查询应该是 select_related(3) 抱歉。数字是它应该下降的深度。
  • 我的错,我之前做的测试是错误的。 select_related(2) 现在可以工作了。
  • @Ross 如何将 select_related() 结果转换为_json()?
猜你喜欢
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
  • 2013-07-02
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多