我正在尝试使用 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")
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")