在MongoAlchemy文档中存储mongo_id?

0 投票
2 回答
1413 浏览
提问于 2025-04-18 17:27

我想知道在MongoAlchemy的字段中,是否可以把mongo_id存储为ObjectId对象。我可以在我手动定义的文档中存储ObjectId,但在MongoAlchemy的ORM环境下,似乎只能存储这个id的字符串值。

下面是我的一些代码:

class Group(db.Document):  
    name = db.StringField()
    trial_id = db.StringField(required=False)
    participants = db.ListField(
        db.DictField(db.AnythingField()), default_empty=True, required=False)

    def add_participant(self, participant):
        self.participants.append({
            'participant_id': participant.mongo_id,
            'start': datetime.utcnow(),
            })

class Trial(db.Document):    
    name = db.StringField()
    groups = db.ListField(
        db.DocumentField(Group), default_empty=True, required=False)

    def add_group(self, group):
        group.trial_id = str(self.mongo_id)
        group.save()

    def get_group(self, group):
        return Group.query.filter(
            {'name': group, 'trial_id': str(self.mongo_id)}).first()

你会看到,在Group类的add_participant方法中,我能够把mongo_id存储为ObjectId对象(因为这是手动创建文档,而不是通过MongoAlchemy的ORM),但在存储到db.StringField时,我却必须把mongo_id转换成字符串。

我尝试把原始的ObjectId存储在db.AnythingField中,但这样就无法通过它进行过滤了。

有没有人知道在MongoAlchemy的字段中存储ObjectId,然后在数据库查询中按它进行过滤是否可行?

谢谢!

2 个回答

0

尝试一下

id = db.ObjectIdField().gen()

这段代码会自动为每个MongoDB对象或文档生成一个唯一的ID,就像关系型数据库中的ID一样。

1

你需要一个 ObjectIdField: http://www.mongoalchemy.org/api/schema/fields.html#mongoalchemy.fields.ObjectIdField

这个字段类型是用来存储 mongo_id 的(虽然这个是特殊处理的)。

撰写回答