MongoEngine:附加ListField

时间:2017-05-05 14:45:02

标签: python mongodb mongoengine

我创建了一个数据库来存储投资组合中的所有交易,这些交易由个人"策略"分隔。

如下面的代码所示,将新合同/交易附加到ListFields作为向数据库添加EmbeddedDocuments的方式有什么缺点?

from mongoengine import *
import datetime

class Trade(EmbeddedDocument):
    tradeDate = DateTimeField(default=datetime.datetime.now(), required=True)
    position = IntField(required=True)

class Contract(EmbeddedDocument):
    contractID = IntField(required=True, unique=True)
    trades = ListField(EmbeddedDocumentField(Trade))

    def addTrade(self, trade: Trade):
        self.trades.append(trade)

class Strategy(Document):
    strategyType = StringField()
    contracts = ListField(EmbeddedDocumentField(Contract))

    def addContract(self, contract: Contract):
        self.contracts.append(contract)

策略创建示例:

contract = Contract(contractID=1234)
contract.addTrade(Trade(position=1))
strat = Strategy(strategyType="Strategy One")
strat.addContract(contract)
strat.save()

每个策略在99%的时间内都会有10个以下的合同,但很多时候,在战略创建到合同之后会增加额外的合同" ListField.

每次对每个特定合约进行交易时,头寸和日期将记录在添加到"交易的新交易文件中。 ListField.

1 个答案:

答案 0 :(得分:1)

会有一个巨大的缺点:插入时间。插入元素列表是O(1)时间似乎很自然,但它不在MongoDB中。将列表附加元素视为插入列表中任何位置的元素,因此需要O(n)时间(n为'合约'列表长度)。当你拥有更大的数据库时,这将是痛苦的。

怎么做? 尝试将每个合约交易保持为带有contractID索引的普通mongo文档。插入时间为O(1),读取时间与List方法类似。