python 和 mongoengine,如何将数据映射到日期时间?

问题描述 投票:0回答:1

我正在尝试使用 mongoengine 将时态数据存储在 mongodb 中。由于数据的日期是主要组成部分,我认为最好将数据映射到日期。但是,在创建文档时,我收到一条错误,指出

Argument to MapField constructor must be a valid field

鉴于 mongoengine 中存在

DateTimeField
,我认为日期时间字段是有效的字段类型。进一步阅读 mongoengine Mapfield 文档,我怀疑我使用错误。

是否可以将数据映射到日期时间字段以存储在 mongoengine 中?

代码

from datetime import datetime
from mongoengine import StringField, MapField, EmbeddedDocument, FloatField, IntField

class PlaySession(EmbeddedDocument):
    hours_played = FloatField(db_field="hoursPlayed")
    enjoyment = IntField(db_field="enjoyment")
    number_of_players = IntField(db_field="playerNum")


class GameDoc(Document):
    game = StringField(db_field="game")
    console = StringField(db_field="console")
    sessions = MapField(datetime, PlaySession, db_field="sessions")
python python-datetime mongoengine
1个回答
0
投票

DateTimeField
是存储日期时间值的有效类型,但它与
MapField
作为键类型不兼容。这就是您收到该错误的原因。您可以使用以下任何替代解决方案:

解决方案 1:使用

MapField
并将日期时间对象存储为字符串

class GameDoc(Document):
    game = StringField(db_field="game")
    console = StringField(db_field="console")
    sessions = MapField(StringField(), PlaySession, db_field="sessions")

# Example
game = GameDoc(game="Some Game", console="PS5")
game.sessions[datetime.now().strftime('%Y-%m-%d %H:%M:%S')] = PlaySession(hours_played=3.0, enjoyment=9, number_of_players=4)
game.save()

解决方案 2:使用

ListField
和存储会话和日期的新文档模型

class SessionEntry(EmbeddedDocument):
    session_date = DateTimeField(db_field="sessionDate")
    session_data = PlaySession()

class GameDoc(Document):
    game = StringField(db_field="game")
    console = StringField(db_field="console")
    sessions = ListField(EmbeddedDocumentField(SessionEntry), db_field="sessions")
© www.soinside.com 2019 - 2024. All rights reserved.