【问题标题】:MongoDB, MongoEngine: How to get Document by its EmbeddedDocument?MongoDB,MongoEngine:如何通过其 EmbeddedDocument 获取文档?
【发布时间】:2013-10-10 19:02:57
【问题描述】:

当我拥有 EmbeddedDocument 对象时,如何访问 Document 对象? 例如:

class ToySale(EmbeddedDocument):
    end_time = FloatField()
    percentage = IntField()

    @property
    def super_price(self):
        # I want to get access to Toy Document, something like that
        return self.toy.price - (self.percentage * self.toy.price / 100)

class Toy(Document)
    sale = EmbeddedDocumentField(ToySale)
    price = IntField()

Django ORM 有类似的 'related_name' 机制,但在 mongoengine ORM 中我没有找到类似的东西。

【问题讨论】:

  • 没有得到你的问题。你想做什么。通过ToySale 获取Toy

标签: python mongodb pymongo mongoengine


【解决方案1】:

您可以通过EmbeddedDocument字段获取文档。

例如end_time:

Toy.objects(sale__end_time=3.14)

percentage:

Toy.objects(sale__percentage=3)

双方:

Toy.objects(sale__end_time=3.14, sale__percentage=3)

如果您已经拥有EmbeddedDocument,例如toy_sale,您可以这样做:

Toy.objects(**{'sale__' + key: value 
               for key, value in toy_sale.to_mongo().items()
               if not key.startswith('_')})

或者只是:

Toy.objects(sale=toy_sale)

请参阅文档:http://mongoengine-odm.readthedocs.org/en/latest/guide/querying.html#filtering-queries

【讨论】:

  • 你给了我一个想法。
【解决方案2】:

问题解决了。

class ToySale(EmbeddedDocument):
    end_time = FloatField()
    percentage = IntField()
    uid = IntField()

    @property
    def super_price(self):
        toy = Toy.objects(sale__uid=self.uid)  # get Document by EmbeddedDocument
        return toy.price - (self.percentage * toy.price / 100)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多