【问题标题】:MongoEngine: Appending ListFieldMongoEngine:附加列表字段
【发布时间】:2017-10-04 02:35:55
【问题描述】:

我正在创建一个数据库来存储投资组合中的所有交易,这些交易由各个“策略”分隔。

如下面的代码所示,将新合约/交易附加到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.的新交易文件中@

【问题讨论】:

    标签: python mongodb mongoengine


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-05
      • 2013-01-11
      • 1970-01-01
      • 2013-05-20
      • 2013-01-14
      • 2015-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多