首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoEngine:追加ListField

MongoEngine:追加ListField
EN

Stack Overflow用户
提问于 2017-05-05 14:45:02
回答 1查看 1.1K关注 0票数 0

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

如下面的代码所示,在ListFields中添加新的合同/交易作为向数据库添加EmbeddedDocuments的方法有哪些缺点?

代码语言:javascript
复制
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)

战略制定实例:

代码语言:javascript
复制
contract = Contract(contractID=1234)
contract.addTrade(Trade(position=1))
strat = Strategy(strategyType="Strategy One")
strat.addContract(contract)
strat.save()

每个策略将有99%的时间低于10份合同,但很多时候,在“合同”ListField.中创建该策略之后,还会添加额外的合同

每次在每一份具体合同上进行交易时,其位置和日期将记录在添加到“交易”ListField.中的新的贸易文件中。

EN

回答 1

Stack Overflow用户

发布于 2017-08-20 10:59:38

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

做什么?试着将每一份合约交易保持为普通的蒙戈文件,并在contractID上建立索引。插入时间为O(1),读取时间类似于列表方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43807872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档